ubuntu中C中的分段错误(内核转储)

ubuntu中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 =

这是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;
}
这是我使用的编译方式

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

请帮助我。

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++;