问题描述
这是一个更大文件的一部分,但这是唯一有问题的功能。这是问题,如果我在未优化的 gcc 中编译它,我将毫无问题地获得我想要的一切。但是,如果我尝试将其编译为 gcc -c -pg -02 main.c, 我收到以下错误消息
解决方法
与任何其他进行输入的函数一样,fgets
可能会因各种原因而失败。您可以从其文档中发现,如果发生这种情况,它将返回 NULL
。但是,由于您不查看其返回值,因此您永远不会知道。这就是编译器试图警告你的。如果失败,数组 line
将不包含有效输入,并且可能包含垃圾,如果您尝试处理它,这会导致您的程序行为不端。
(在很多情况下,一些警告只在优化打开时发生;这是因为编译器在优化过程中对代码进行了更详细的分析,这使得它更有可能检测到此类问题。但是这是一件好事;这不是优化的问题,也不是不使用它的理由。)
如果 fgets
失败,您的程序没有明显的恢复方法,因此最简单的方法是让它退出并显示错误消息。 perror
函数是一种方便的方法;它会打印一条人类可读的消息,该消息对应于 errno
应设置的 fgets
变量中的错误代码。
因此,此处错误检查的基本形式是将 fgets
行替换为:
if (fgets(line,MAX_LINE,stdin) == NULL) {
perror("Failed to read input");
exit(1);
}
一些你可以在以后改进的地方:
-
fgets
返回 NULL 的一个可能原因是文件结束:如果根本没有输入:用户在终端上按下文件结束键(通常是 Ctrl- D 在 Unix 上,Ctrl-Z 在 Windows 上)或从空文件重定向输入。这不完全是错误,它不会在errno
中产生错误代码,因此在这种情况下perror
可能会打印出误导性消息。尝试修复此错误。您可以使用ferror
函数区分这两种情况。 -
如果一行成功读取但无法解析为数字,
strtol
将失败。您目前也没有检查。查看它如何指示此故障并进行相应处理。