我试图运行一个找到文件字数的程序。每次编译程序时,它都会给我一个分段错误(Core Dumped)。无法弄清楚原因。
#include <stdio.h>
int main(int argc, char* argv[]){
int wc = 1;
FILE *input = fopen(argv[1],"r");
char c = fgetc(input);
while(c != EOF){
if(c == ' '){
wc++;
}
else
c = fgetc(input);
}
fclose(input);
printf("Word Count = %d", wc);
return 0;
}
答案 0 :(得分:1)
您可能因为未在命令行中传入文件名而进行分类。执行此操作时,argv[1]
为NULL,因此fopen
将取消引用NULL指针。
您可以在命令行上将文件名传递给您的程序,如下所示:
./my_program file_to_test
要防止核心转储,您应该通过检查argc
的值来检查是否传入了参数。您还应检查fopen
的返回值以确保文件已打开:
if (argc < 2) {
printf("no file name given");
exit(1);
}
FILE *input = fopen(argv[1],"r");
if (input == NULL) {
perror("fopen failed");
exit(1);
}
然后你有另一个问题:
if(c == ' '){
wc++;
}
else
c = fgetc(input);
当您找到空格字符时,您不会尝试阅读下一个字符。因此,c
在读取空格后不会发生变化,从而导致无限循环。
您需要摆脱else
并始终致电fgetc
:
if(c == ' '){
wc++;
}
c = fgetc(input);
此外,fgetc
函数会返回int
(实际上unsigned char
强制转换为int
),因此您应将c
声明为{{} 1}}。否则,对int
进行检查可能会失败。