2013-03-15 6 views
0

Точка программы - взять 2 файла, один словарь, а другой - текст, создать выходной файл и вставить в него все слова в текстовом файле, но заглавными словами, которые не существует в словаре.Застрял в петле fscanf

Когда я запускаю программу, он продолжает просить ввода, поэтому кажется, что я застрял в цикле fscanf. И у меня всего три петли 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 Для вас тоже :) (Не так ли, у кого это было раньше?) – 2013-03-15 21:08:08

+0

Спасибо за ваш ответ, я использовал -Wall (я использую putty) –

0

Это:

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

Этот цикл заканчивается только тогда, когда fscanf() находит входные данные, которые не конвертировать с помощью %s. Ну ... в основном все будет конвертировать с %s, так что это будет читать весь файл, ограниченный пробелами. В конце концов, fscanf() вернет EOF, но EOF < 0, так что он все равно не сломает ваш цикл. Вы, наверное, хотели сравнить с EOF:

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

Это делает не адрес тот факт, что nothing является char и переливается. Этот метод небезопасен без массива и явный предел ширины поля. Так как вы не заботитесь о хранении его в любом случае, хотя, есть особый случай, когда вы можете сказать fscanf() отказаться от него, говоря %*s:

/*first fscanf loop*/ 
while ((fscanf(infi,"%*s")!=EOF)) 
    wordcount++; 
Смежные вопросы