1

プログラムのポイントは、1 つの辞書ともう 1 つのテキスト ファイルの 2 つのファイルを取得し、出力ファイルを作成して、テキスト ファイル内のすべての単語をその中に入れますが、辞書に存在しない単語は大文字にします。

プログラムを実行すると、入力を求められ続けるため、fscanf ループに陥っているようです。fscanf ループは 3 つしかありません。そのうちの 1 つであるに違いありませんが、どれがなぜなのかわかりません。

     #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));
     }
4

2 に答える 2

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また、ループ条件の後の余分なセミコロンなど、いくつかの構文エラーがあるようです。

于 2013-03-15T20:59:39.173 に答える
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++;

これは、がオーバーフローするという事実に対処していません。このメソッドは、配列がなく、フィールド幅が明示的に制限されていないと安全ではありません。ただし、とにかく保存することは気にしないので、次のように言って破棄するように指示できる特別なケースがあります。nothingcharfscanf()%*s

   /*first fscanf loop*/
 while ((fscanf(infi,"%*s")!=EOF))
     wordcount++;
于 2013-03-15T21:11:34.523 に答える