好的,所以我不确定这里发生了什么。我有一个简单的函数int foo(char *filename)
,它接受filename
并计算文件中的单词。
int foo(char *filename){
FILE *inFile;
int wordCount = 0;
printf("foo\n"); // test printf() statement (currently prints)
char word[50];
inFile = (&filename, "r");
printf("infile\n"); // test printf() statement (currently prints)
while (1){
printf("while"); // test printf() statement (doesn't print)
fscanf(inFile, "%s", word);
if (feof(inFile))
break;
printf("%d", wordCount); //test printf() statement
wordCount++;
}
fclose(inFile);
return wordCount;
}
如你所见,我打印“infile”,但不是“while”。我遇到了分段错误。有没有人知道为什么这不起作用另外,我的inFile = (&filename, "r");
声明是否正确?我指点不是那么好。
答案 0 :(得分:7)
我很惊讶这条线实际编译:
inFile = (&filename, "r");
如果您要尝试打开文件:
inFile = fopen(filename, "r");
编辑:
如上所述,您需要使用printf
结束\n
或致电fflush(stdout)
,否则会被缓冲而不能打印。
答案 1 :(得分:4)
你期望这条线做什么?
inFile = (&filename, "r");
因为看起来你错过了一个功能性的电话。我怀疑你想要这样的东西:
inFile = fopen(filename, "r");
也就是说,fopen
函数需要一个字符指针,你有这个:
int foo(char *filename){
因此您无需使用&
运算符。 &
运算符返回变量的地址,因此输入&filename
最终会得到(指向(char)的指针)。你很少会使用{{1带字符串的运算符;当函数需要返回多个值时(例如Unix &
函数),您通常会看到它被使用。
有很多教程可以更详细地讨论C指针;谷歌搜索“c指针”会产生一些可能的结果。当然,请阅读你的K& R:)。
答案 2 :(得分:3)
您没有看到“while”打印的原因是因为它没有以\n
终止,因此在发生seg故障时保留在缓冲区中而不打印出来。
seg错误发生在fscanf
,因为你错过了fopen
,搞砸了你的指针。 @Mystical解释了如何修复它。
答案 3 :(得分:2)
始终检查来自fopen()
的返回值,该呼叫似乎缺失。
FILE *inFile = fopen(filename, "r");
if (inFile == 0)
...diagnose error...do not use inFile...
请注意&
来电中filename
的{{1}}缺席;你根本就不需要它。
fopen()
之前的printf()
不会产生任何结果,因为输出字符串不以换行符结尾;它会一直打印到你打印换行符,然后崩溃就会发生。
发生崩溃是因为字符串fscanf()
不是有效的文件流;如果你真的打电话给"r"
,那可能是因为开放失败而你没有检查它。
如果您的编译器没有给出关于代码的警告,请获得更好的编译器。如果它确实给你警告,请在发布到StackOverflow之前学会注意它们(并修复它们)。
当你遇到它时,你可能想要考虑如果你要阅读的单词是50个字符或更长时间会发生什么。幸福没有随之而来。你应该考虑使用:
fopen()
如果一个单词超过49个字符,它至少现在将被分成若干个49字节单位(每个单位计为一个单词),而不会给你带来缓冲区溢出问题(另一个崩溃源)。如果你需要在循环中进行诊断打印,那就这样吧;添加大括号并打印。
我很少有理由在我(25年以上)的编程生涯中使用while (fscanf("%49s", word) == 1)
wordCount++;
。使用它的代码通常是可疑的;我想知道这个人是否学过帕斯卡尔并且在学习C时没有学过它。