2016-03-15 42 views
0

我试图运行一个程序来查找文件的字数。每次我编译程序时,都会给我一个分段错误(Core Dumped)。无法弄清楚原因。字数,分段错误 - C

#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; 
} 
+1

“我编译程序时,它给了我一个分段错误”。我假设你的意思是你运行程序的时候。那么你如何运行该程序?也许'fopen'失败了。您应该始终使用错误检查代码来验证函数调用是否成功。 – kaylum

+0

您还应该检查'argc'以确保文件名作为参数传递。顺便说一句,第一次'c'是一个空格,你将进入一个无限循环,因为之后你再也不会读新的'c'了。为什么在找到任何单词之前'wc'设置为1? – lurker

+0

'char c = fgetc''fgetc'有意返回一个'int',而不是'char'。并始终检查功能结果的错误! – Olaf

回答

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),所以你应该声明cint 。否则,检查它对EOF可能会失败。

+0

还有一件事:'c'应该是一个'int' –