C 计算文件中的单词数?

C 计算文件中的单词数?,c,file,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

我有一个用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);
  }
}

#包括
#包括
void main(int argc,char*argv[])
{ 
int h,i;
文件*fp;
char*mess;
对于(i=1;i
混乱是未初始化的。你需要为正在阅读的单词分配一些空间

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

因此,您还希望使用字段宽度将读取的内容限制为缓冲区的大小。这需要小心处理,因为缓冲区大小后的位可能是“the”(例如,“breathe”,如果你读4个字符的单词,会给你“brea”和“the”,并且是假阳性)

混乱是未初始化的。你需要为正在阅读的单词分配一些空间

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


因此,您还希望使用字段宽度将读取的内容限制为缓冲区的大小。这需要小心处理,因为缓冲区大小后的位可能只是“the”(例如,“breathe”,如果您读取4个字符的单词,将给您“brea”和“the”以及假阳性)

fscanf(fp,“%s”,mess)不会分配内存

fscanf(fp,“%s”,mess)不会分配内存

char*mess
是一个统一的指针。换句话说:它是一个变量,其值是内存中的随机地址。在您对
fscanf
的调用中,将尝试在此地址写入内容,您的程序将崩溃


要么使
mess
成为一个固定大小的数组,要么使它指向一个使用
malloc
动态分配的有效内存块(这里可能没有用)。在这两种情况下,您可能需要确保读取的字符数不能超过
大小
字符,否则将导致全新的分段错误。

字符*混乱
是一个统一的指针。换句话说:它是一个变量,其值是内存中的随机地址。在您对
fscanf
的调用中,将尝试在此地址写入内容,您的程序将崩溃


要么使
mess
成为一个固定大小的数组,要么使它指向一个使用
malloc
动态分配的有效内存块(这里可能没有用)。在这两种情况下,您可能需要确保读取的字符数不能超过
大小
,否则将导致一个全新的分段错误。

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

char-mess[256]


当前,
mess
未初始化(null)
sscanf
尝试写入时会出错

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

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

当前,
mess
未初始化(null)
sscanf
尝试写入时会出错

while (!feof(fp))
{ 
  fscanf(fp,"%s",mess);
  if (strcmp(mess,"the")==0)
  h++;
}
您正在从文件中读取字符串,并将其放入
mess
,这是指向字符的普通指针。您需要字符数组:

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

char mess[1000];

据我从代码中了解,在使用fscanf填充
mess
指针之前,您尚未初始化该指针:

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

据我从代码中了解,在使用fscanf填充
mess
指针之前,您尚未初始化该指针:

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

使用
mess=malloc(sizeof(char)*SOME_NUMBER)
或简单地将mess声明为字符数组,即char-mess[1024],为mess分配内存

使用
mess=malloc(sizeof(char)*SOME_NUMBER)
或简单地将mess声明为字符数组,即char-mess[1024]

如果为其分配了一些内存,“指向字符的普通指针”就可以了。如果为其分配了一些内存,“指向字符的普通指针”就可以了。我可以补充一点,C对于这种工作来说是多余的吗?“main=interactive$show.length.filter(=”the”).words”就足够了。@IGCA,这大概是一个赋值。我可以补充一下,对于这种工作来说,C是一个多余的任务吗?“main=interactive$show.length.filter(=”the”).words“足够了。@IGCA,这可能是一个赋值。