ubuntu中C中的分段错误(内核转储)
这是main.c 这是print.cubuntu中C中的分段错误(内核转储),c,ubuntu,segmentation-fault,fault,C,Ubuntu,Segmentation Fault,Fault,这是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 =
#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;
}
这是我使用的编译方式
但我不知道为什么我有分段错误(核心转储)
请帮助我。在main()
中,您应该通过查看返回值是否为NULL来检查fopen()
是否成功,在这种情况下会发生错误
此外,您正在使用argv[1]
,即使argc>1
条件不满足main()
中的第二个fopen()
<如果argc
小于2
,则code>argv[1]
将不存在
在printfile()
中的while
循环中,break
语句将在第一次迭代本身执行
因此,将while
转换为if
语句并删除break
将具有相同的效果
在wc()
的while
循环中
可以
if (a == ' ')
word++;
else if (a == '\n')
line++;
无需检查a
是否为\n
如果a
为
(空格)
编辑:使用完毕后,不要忘记关闭所有打开的文件。使用所有警告和调试信息编译:
gcc-Wall-Wextra-g
。然后使用调试器gdb
;你的“修复我的代码”问题与主题无关。阅读您正在使用的每个标准函数:-以及许多其他函数-可能会失败。测试它是否不喜欢发布文本而不是它的图像会更好。首先,你打开文件两次,中间没有关闭。我的英语和C编程还很差。我理解你的评论,但我对fclose()一点都不了解。。。如果你还好的话,你能教我在代码中应该在哪里使用fclose()吗…?@Huitseize一旦你使用完一个文件。如果您仍然需要该文件,但需要打开另一个文件,请使用不同的文件指针打开它。@Huitseize如果在main()
中删除第二个fopen()
,则使用fclose()
似乎是合适的。
if (a == ' ')
word++;
if (a == '\n')
line++;
if (a == ' ')
word++;
else if (a == '\n')
line++;