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