1

该程序的重​​点是取2个文件,一个字典,另一个是文本,创建一个输出文件,并将文本文件中的所有单词放入其中,但将字典中不存在的单词大写。

当我运行程序时,它一直在询问输入,所以我似乎陷入了 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));
     }
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++;

这并没有nothing解决achar并且将溢出的事实。如果没有数组和字段宽度的明确限制,此方法是不安全的。但是,由于您无论如何都不关心存储它,因此有一种特殊情况,您可以fscanf()通过以下方式告诉丢弃它%*s

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