计算文件中的单词?

时间:2010-11-23 12:28:53

标签: c file

我有一个用C编写的程序,它应该计算在文本文件中出现的单词“the”作为参数给出的次数。但是程序一直给出一个分段错误错误,我没有更多的想法如何解决这个问题。非常感谢。谢谢!

以下是代码:


#include <stdio.h>
#include <string.h>
void main(int argc, char *argv[])
{ 
  int h,i;
  FILE *fp;
  char* mess;
  for(i=1; i < argc; i++)
  { 
     h=0;
     fp=fopen(argv[i],"r");
      while (!feof(fp))
      { 
        fscanf(fp,"%s",mess);
        if (strcmp(mess,"the")==0)
          h++;
      }
      printf("The file %s contains the word \"the\" %d times.",argv[i],h);
      h=0; 
      fclose(fp);
  }
}

7 个答案:

答案 0 :(得分:5)

 char* mess;
 [...]
       fscanf(fp,"%s",mess);
混乱是没有初始化的。你需要为你正在阅读的单词分配一些空间

  

s匹配一系列的   非空白字符;下一个   指针必须是指向char的指针,并且   数组必须足够大   接受所有序列和   终止NUL字符。输入   字符串在空格或在空格处停止   最大字段宽度,以发生者为准   第一

因此您还希望使用字段宽度将读取的内容限制为缓冲区的大小。这需要一些小心处理,因为缓冲区大小之后的位可能是“the”(例如“呼吸”,如果你读了4个字符的话,会给你“brea”和“the”和误报)

答案 1 :(得分:1)

char* mess是一个单位指针。换句话说:它是一个变量,其值是内存中的随机地址。在致电fscanf时,我们会尝试在此地址写一些内容,而您的程序会崩溃。

使mess成为固定大小的数组,或者使其指向使用malloc动态分配的有效内存块(这里可能没用)。在这两种情况下,您可能希望确保不能读取超过size个字符,否则最终会出现全新的细分错误。

答案 2 :(得分:0)

fscanf(fp,"%s",mess);不会分配内存!

答案 3 :(得分:0)

您需要为mess提供的缓冲区sscanf分配内存:

char mess[256];

目前,mess未初始化(null)。 sscanf试图写信给它。

答案 4 :(得分:0)

while (!feof(fp))
{ 
  fscanf(fp,"%s",mess);
  if (strcmp(mess,"the")==0)
  h++;
}

您正在从文件中读取一个字符串,将其放入mess,这是一个指向char的普通指针。你需要字符数组:

char mess[1000];

答案 5 :(得分:0)

就我可以从代码中读取而言,在用fscanf填充之前,你还没有初始化mess指针:

fscanf(fp,"%s",mess);

答案 6 :(得分:0)

使用mess=malloc(sizeof(char)*SOME_NUMBER)或者简单地将乱码声称为字符数组,即char mess [1024];