我正在制作一个计算文件中包含的单词数量的程序。我的代码适用于某些测试用例,其中包含少于一定数量的单词/字符的文件......但是当我测试它时,让我们说一句话:
" loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong&#34 ;,(这不是随机 - 这是我&#39的实际测试案例; M要求检查),它给我这个错误:
*** stack smashing detected ***: ./wcount.out terminated
Abort (core dumped)
我知道错误意味着什么,我必须实现某种malloc代码行才能分配适量的内存,但我无法弄清楚我的函数放在哪里或者该怎么做:
int NumberOfWords(char* argv[1]) {
FILE* inFile = NULL;
char temp_word[20]; <----------------------I think this is the problem
int num_words_in_file;
int words_read = 0;
inFile = fopen(argv[1], "r");
while (!feof(inFile)) {
fscanf(inFile, "%s", temp_word);
words_read++;
}
num_words_in_file = words_read;
printf("There are %d word(s).\n", num_words_in_file - 1);
fclose(inFile);
return num_words_in_file;
}
答案 0 :(得分:0)
由于您通过呈现源代码无效而正确识别(未来提示:/* put your arrows in comments */
),问题是temp_word
只有足够的空间容纳20个字符(其中一个必须是终止空字符)。
此外,您应该检查fopen
的返回值。我会把它作为锻炼给你。我已经在其他问题(例如this one)中回答了这个问题,但我不认为只是将代码推到脸上会对你有帮助。
在这种情况下,我认为更好地分析您所遇到的问题可能会付出代价,看看您是否确实需要存储单词来计算它们。当我们定义单词(由scanf("%s", ...)
读取的那种非空白字符序列后跟一系列(零个或多个)空白字符时,我们可以看到这样的< em>计算计划,因为您需要遵循以下程序:
您不需要存储非空白空间,因为一旦您阅读了它,您就永远不会重新访问它。因此你可以把它写成两个嵌入到一个循环中的循环:一个循环读取尽可能多的空白,另一个读取非空格,然后是你的增量,然后外循环重复整个批次......直到{{1}到达了......
使用EOF
指令可以最好地实现这一点,该指令告诉%*s
相关函数不要尝试存储字。例如:
scanf
答案 1 :(得分:0)
您受到阵列大小的限制。一个简单的解决方案是增加阵列的大小。但如果有人输入一个长篇大论,你总是容易受到砸碎。
单词由空格分隔。
您可以简单地存储一个初始化为零的计数器变量,以及一个记录您正在查看的当前char的变量。每次使用fgetc(inFile, &temp)
作为空格读取角色时,都会增加计数器。
答案 2 :(得分:-1)
你的方法可以带来好的结果,但它有点激烈。您不应该直接从文件中读取单词,而是读取行,并计算这些行中的单词。我建议您查找有关 fgets 和 strtok 的信息(如果需要,可以不用 strtok 制作)。