段故障(核心转储在c)中在Ubuntu
这是main.c中
这是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)
这是我使用的编译方式。
但我不知道为什么我有分段错误(核心转储)。
请帮帮我。
在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
是(空间)。
编辑:并且不要忘记在完成使用后关闭所有打开的文件。
我在英语和C编程方面还很差。我理解你的评论很多东西,但是,我不明白关于fclose()的一件事...如果你没事,你能教我在哪里应该在我的代码中使用fclose()...? – Huitseize
@Huitseize一旦完成使用文件。如果您仍然需要该文件但需要打开另一个文件,请使用_different_文件指针将其打开。 –
@Huitseize如果你在'main()'中删除了第二个'fopen()',那么'fclose()'的用法看起来是合适的。 –
编译所有警告和调试信息:'gcc -Wall -Wextra -g'。然后使用调试器'gdb';你的修复我的代码问题是脱离主题。阅读您正在使用的每个标准功能:[fopen(3)](http://man7.org/linux/man-pages/man3/fopen.3.html)以及许多其他功能可能会失败。测试它不喜欢[这里](https://stackoverflow.com/a/18193383/841108) –
发布文字而不是它的图像会更好。 –
首先,你打开文件两次而不关闭文件。 –