2017-10-06 101 views
-3

enter image description here段故障(核心转储在c)中在Ubuntu

这是main.c中

enter image description here

这是print.c

#include <stdio.h> 
int wc(FILE *pointer) 
{ 
    int a; 
    int character=0,word=0,line=0; 
    a = getc(pointer); 
    while (a != EOF) 
    { 
    character++; 
    if (a == ' ') 
     word++; 
    if (a == '\n') 
     line++; 
    a = getc(pointer); 
    } 

    printf("character: %4d, word: %4d, line: %4d \n", character,word,line); 
    return 0; 
} 

这是word.c

gcc -c print.c 
gcc -c word.c 
gcc -c main.c 
gcc -o main main.o print.o word.o 
./main 
text.txt 
text.txt 
segmentation fault (core dumped) 

这是我使用的编译方式。

但我不知道为什么我有分段错误(核心转储)。

请帮帮我。

+1

编译所有警告和调试信息:'gcc -Wall -Wextra -g'。然后使用调试器'gdb';你的修复我的代码问题是脱离主题。阅读您正在使用的每个标准功能:[fopen(3)](http://man7.org/linux/man-pages/man3/fopen.3.html)以及许多其他功能可能会失败。测试它不喜欢[这里](https://stackoverflow.com/a/18193383/841108) –

+1

发布文字而不是它的图像会更好。 –

+2

首先,你打开文件两次而不关闭文件。 –

回答

1

main()中,您应该通过查看返回值是否为NULL来检查fopen()是否成功,在这种情况下发生错误。

此外,即使条件argc>1不满意第fopen()main()中,您正在使用argv[1]。如果argc小于2,则argv[1]将不存在。

printfile()while循环中,break声明将在第一次迭代本身执行。

因此,将while转换为if语句并删除break会产生同样的效果。

while循环的wc()

if (a == ' ') 
    word++; 
if (a == '\n') 
    line++; 

可以作出

if (a == ' ') 
    word++; 
else if (a == '\n') 
    line++; 

不需要检查是否a\n如果a(空间)。

编辑:并且不要忘记在完成使用后关闭所有打开的文件。

+0

我在英语和C编程方面还很差。我理解你的评论很多东西,但是,我不明白关于fclose()的一件事...如果你没事,你能教我在哪里应该在我的代码中使用fclose()...? – Huitseize

+0

@Huitseize一旦完成使用文件。如果您仍然需要该文件但需要打开另一个文件,请使用_different_文件指针将其打开。 –

+0

@Huitseize如果你在'main()'中删除了第二个'fopen()',那么'fclose()'的用法看起来是合适的。 –