2013-03-15 5 views
0

프로그램의 요점은 2 개의 파일, 하나의 사전과 다른 하나는 텍스트이고, 출력 파일을 만들고, 텍스트 파일에 모든 단어를 넣는 것이지만 그 단어를 대문자로 사용하는 것입니다. 사전에 존재하지 않습니다.fscanf 루프에 갇혀있다

프로그램을 실행할 때 입력 요청이 계속되어 fscanf 루프에 걸렸습니다. 그리고 난 단지 3 fscanf 루프 있습니다. 그것들 중 하나 여야합니다. 그러나 나는 왜 그리고 어떤 이유인지 알 수 없습니다.

 #include <stdio.h> 
    #include <string.h> 
    #include <stdlib.h> 
    #include <errno.h> 
    #include <ctype.h> 

    #define wosi 20 
    int comp (const void *a, const void *b); 

    int main(int ac, char *av[]) 
    { 
     int wordcount,i; 
     FILE *infi, *outfi; 
     char nothing, *dicptr, fina[100],letter[wosi]; 
     unsigned char c; 
     /*to return error in case number of arguments mismatch*/ 
     if (ac!=3) 
     { 
      fprintf (stderr," prog3: Man, I need 3 arguments to work!\n"); 
      return (1); 
     } 
      /*first fscanf loop*/ 
     while ((fscanf(infi,"%s",&nothing)!=0)) 
      wordcount++; 
     /* end of step 2 */ 
     dicptr = malloc(wordcount * wosi); 
     /* end of step 3*/ 

     rewind(infi); 
      /*second fscanf loop */ 
     for (i=0; fscanf(infi,"%s",&dicptr[i*wosi]) ;i++){} 

     /* this is qsort stage (finishing step 4) */ 

     qsort (dicptr,wordcount,wosi,comp); 

     /*step 5 */ 
     fclose (infi); 
     infi = fopen(av[2],"r"); 

     if (infi == NULL) 
     { 
      perror("opening"); 
      fprintf(stderr,"Can't open %s, the file is empty\n",av[2]); 
      return(1); 
     } 
     /*step 6 here */ 

     strcpy(fina, av[2]); 
     strcat(fina, ".out"); 

     outfi = fopen(fina, "w"); 

     /*step 7*/ 
      /* third fscanf loop */ 
     while((fscanf(infi, "%s", letter)!= EOF)); 
     { 
      for(i=0; letter[i]!='\0' ;i++) 
      { 
       c=letter[i]; 
       letter[i]= toupper(c); 
      } 

      if(bsearch(letter,dicptr,wordcount,wosi,comp)) 
      { 
       for(i=0;letter[i]!='\0';i++) 
       { 
        c=letter[i]; 
        letter[i]= tolower(c); 
       } 
      } 

      /* fputs to print in out file*/ 
      for(i=0; letter[i];i++) 
      { 
       fprintf(outfi,"%s",letter); 
      } 
     } 
     free(dicptr); 
     return (0); 
    } 

    int comp (const void *a, const void *b) 
    { 
     return (strcmp((const char *) a, (const char*) b)); 
    } 
+0

http://stackoverflow.com/q/15440488/1758762 – duDE

+0

모든 루프 앞뒤에 stderr에 마커를 인쇄하여 루프를 해결할 수 있습니까? –

+0

인쇄 마커를 넣으려고했지만 문제는 여전히 동일합니다. –

답변

2

이것은 CodeReview.SE이 아니므로 일부 힌트 만 제공하려고합니다.

첫째, 난 당신이 컴파일을위한 -Wall 컴파일러 플래그를 사용하지 않았다 내기 :

h2co3-macbook:~ h2co3$ clang -Wall -o baz baz.c 
baz.c:24:14: warning: variable 'wordcount' is uninitialized when used here 
     [-Wuninitialized] 
     wordcount++; 
     ^~~~~~~~~ 
baz.c:12:23: note: initialize the variable 'wordcount' to silence this warning 
    int wordcount,i; 
      ^
       = 0 
baz.c:23:25: warning: variable 'infi' is uninitialized when used here 
     [-Wuninitialized] 
    while ((fscanf(infi,"%s",&nothing)!=0)) 
      ^~~~ 
baz.c:13:20: note: initialize the variable 'infi' to silence this warning 
    FILE *infi, *outfi; 
     ^
      = NULL 
2 warnings generated. 

둘째, 당신은 comp() 기능을 사용하여 문자 또는 문자열을 비교하는 의미합니까? 전자의 경우

return *(const char *)a - *(const char *)b; 

후자의 경우

return strcmp(*(const char **), *(const char **)b); 

또한 while 루프의 상태 후 불필요한 세미콜론과 같은 몇 가지 구문 오류가 나타납니다.

+0

_ "불필요한 세미콜론과 같은 구문 오류가있는 것 같습니다. while 루프의 상태. "_ - 좋은 캐치! –

+0

@SeanBright 당신도 역시 :) (실제로 그 사람이 먼저있는 사람이 아니 었나요?) –

+0

응답 해 주셔서 감사합니다. -Wall (퍼티를 사용하고 있습니다)을 사용했습니다. –

0

이 : fscanf()%s를 사용하여 변환하지 않습니다 입력을 발견하면

/*first fscanf loop*/ 
while ((fscanf(infi,"%s",&nothing)!=0)) 
    wordcount++; 

이 루프는 종료됩니다. 음 ... 기본적으로 모든 것이 %s으로 변환되므로 공백으로 구분 된 전체 파일을 읽습니다. 결국 fscanf()EOF을 반환하지만 EOF < 0을 반환하므로 루프가 손상되지 않습니다. 당신은 아마 EOF에 대해 비교하고 싶었 :

/*first fscanf loop*/ 
while ((fscanf(infi,"%s",&nothing)!=EOF)) 
    wordcount++; 

이 수행 하지 주소 nothingchar이며, 오버 플로우는 사실. 이 메서드는 배열 및 필드 너비에 대한 명시적인 제한이 없으면 안전하지 않습니다. 어쨌든 그것을 저장 신경 쓰지 않기 때문에,하지만, 당신이 fscanf()을 말할 수있는 특별한 경우가 %*s 말하여 폐기 할 수있다 :

/*first fscanf loop*/ 
while ((fscanf(infi,"%*s")!=EOF)) 
    wordcount++;