#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char word[22];
FILE*fp;
fp=fopen("abc.txt","rt");
int count_kor=0,kor=0; //한글
int count_eng=0,eng=0; //영어
int count_num=0,num=0; //숫자
int count_han=0,han=0; //한자
int count_etc=0,etc=0; //특수문자
int kor_eng=0; //한글+영어
int len=0;
int i;
if((fp=fopen("abc.txt","rt"))==NULL){
fprintf(stderr,"파일을 열 수 없습니다.\n");
exit(1);}
while(fscanf(fp,"%s",word) != EOF)
{
count_eng=0;
count_kor=0;
count_num=0;
count_etc=0;
count_han=0;
len=strlen(word);
//word= (char*)malloc(sizeof(char)*len+1);
for(i=0;i<len; i++) //문자열길이만큼 반복
{
if((0x41<=word[i] && word[i]<=0X5A) || (0X61<=word[i] && word[i]<=0X7A))//영어
count_eng++;
else if(0x30<=word[i] && word[i]<=0x39)//숫자
count_num++;
else if(word[i]>=0x21 && word[i]<=0x2F)//특수문자
count_etc++;
else if(word[i] & 0x80) //첫번째 비트가 1인가
{
if((word[i] >= 0xffffffB0) && (word[i] <= 0xffffffC8) && (word[i+1] >= 0xffffffA1) && (word[i+1] <= 0xffffffFE))
count_kor++;//한글
else
count_han++;//한자
}
}
//memset(word,0,250*sizeof(char));
if(count_eng>0 && count_kor>0) //한글+영어
kor_eng++;
else if(count_eng>0 && count_kor==0)//영어
eng++;
else if(count_kor>0 && count_eng==0)//한글
kor++;
else if(count_num>0)//숫자
num++;
else if(count_etc>0)//특수기호
etc++;
else if(count_han>0)//한자
han++;
}
printf("한글단어는%d 영어%d 한글+영어%d 한자%d 특수문자%d 숫자%d 개입니다. \n",kor,eng,kor_eng,han,etc,num);
fclose(fp);
return 0;
}
일단 텍스트 파일의 영어, 한글, 영어 한글갯수를 세는 프로그램입니다.. 구조체같은걸 쓰지않고 그냥 짠거라 지저분하긴한데..
아무튼 이걸 적은 크기의 텍스트 파일에서 돌리면 정확하게 카운터가 되는데요..
교수님이 갑자기 20m짜리 파일을 뙇!!!
역시나 큰파일로 해서 해보니깐 안되더라구요 ㅜㅜ
그래서 일단 아마도 word[20]라는 단어를 세는 배열에 동적배열을 쓰면 좀더 메모리를 적게 잡고 쓸수 있지 않을까해서
동적할당을 해봤는데요
char *word;
word= (char*)malloc(sizeof(len+1));
이런식으로 했는데 제가 책보고 배운걸로는 이렇게가 맞는것 같은데..ㅜㅜ
동적할당이 참 어려운것같아요...
그리고 저기서 프리를 하려면 어디에서 프리 시켜야 하나요?
와일문안에서 프리 시켜야 할까요?? 아 좀 도와주시면 감사하겠습니다 ㅜ;;
그리고 memset을 시키는것도 메모리에 도움이 될까요??