尝试 运行 优化的 c 文件时收到 fgets 警告

Getting fgets warning when trying to run optimized c file

这是一个更大文件的一部分,但这是唯一有问题的函数。这就是问题所在,如果我在未优化的 gcc 中编译它,我将毫无问题地得到我想要的一切。但是,如果我尝试将其编译为 gcc -c -pg -02 main.c, 我收到以下错误消息

与任何其他进行输入的函数一样,fgets 可能会因多种原因而失败。正如您可以从其文档中找到的那样,如果发生这种情况,它将 return NULL。但是,由于您不查看其 return 值,因此您永远不会知道。这就是编译器试图警告您的内容。如果失败,数组 line 将不包含有效输入,并且可能包含垃圾,如果您尝试处理它会导致程序运行异常。

(在很多情况下,一些警告只在优化开启时发生;这是因为编译器在优化过程中对代码进行了更详细的分析,这使得它更有可能检测到此类问题.但这是一件好事;这不是优化的问题或不使用它的理由。)

如果 fgets 失败,您的程序没有明显的恢复方法,所以最简单的方法是让它退出并显示一条错误消息。 perror 函数是一种方便的方法;它打印一条人类可读的消息,对应于 errno 变量的错误代码,fgets 应该设置。

因此,此处错误检查的基本形式是将 fgets 行替换为:

if (fgets(line,MAX_LINE ,stdin) == NULL) {
    perror("Failed to read input");
    exit(1);
}

您以后可以改进的一些事情:

  • fgets 到 return NULL 的一个可能原因是文件结束:如果根本没有输入:用户点击了文件结束他们终端上的键(通常是 Unix 上的 Ctrl-D,Windows 上的 Ctrl-Z)或从空文件重定向输入。这不完全是一个错误,它不会导致 errno 中的错误代码,因此 perror 在这种情况下可能会打印出误导性消息。尝试修复此错误。您可以使用 ferror 函数区分这两种情况。

  • 如果成功读取一行但无法解析为数字,strtol 将失败。您目前也不检查。查看它如何指示此故障并进行相应处理。