c - 忽略 gobble-only scanf (gcc) 的返回值

标签 c gcc scanf suppress-warnings

所以我读了this question和其他相关问题,我知道检查 scanf 的返回值以避免意外是个好主意。 但是我的代码中有以下 scanf:

/*
 * If we don't gobble newlines,
 * then they'll be interpreted as commands.
 * Gobble both \n and \r (because the input files use 0x0D).
 */
(void) scanf("%*[\n\r]");

如您所见,我将 scanf 的结果转换为 void,但 GCC 仍会在 -ansi -pedantic -Wall -O3< 下发出警告,如前所述here .

如果没有特定于编译器的指令(即,在纯 ANSI C90 中),我是否可以采取任何干净的措施来抑制此警告? (我所说的干净是指没有 if (scanf(...)); 或类似的东西。)

最佳答案

GCC 4.4 在这种情况下会发出警告,但 4.7 和 4.9 不会。这与您链接的 GCC 错误中的声明一致,该错误已在 4.5 中修复。因此,一种选择是使用不到五年的编译器版本。

如果您受困于 GCC 4.4 或更早版本,您可以这样做:

int dummy = scanf("%*[\n\r]");
(void)dummy;

对于许多 C 或 C++ 程序员来说,这应该是一种熟悉的模式。

如果出于某种原因您反对使用两个语句并且不想创建@pm100 建议的 ignore() 函数,您也可以这样做:

abs(scanf("%*[\n\r]"));

不过,我更喜欢(void)dummy 解决方案。

最后,您可以完全避免 scanf() 并执行类似这样的操作(未经测试,不能 100% 确定它是否满足您的需要):

int ch;
do {
  ch = getchar();
} while (ch == '\r' || ch == '\n');
ch = ungetc(ch, stdin);
assert(ch != EOF);

显然,您会将所有这些都放在一个带有描述性名称的漂亮小函数中,这对于 scanf() 解决方案来说可能也是一个好主意。

关于c - 忽略 gobble-only scanf (gcc) 的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28357707/

相关文章:

c - scanf的 "%[^\n]"和 "%s"有什么区别?

C89,混合变量声明和代码

我可以使用 C 作为我的引擎的脚本语言吗?

c - 如何将可执行入口点的名称从 main 更改为其他名称?

c - 使用 GTK+2 时收到 “format not a string literal and no format arguments” 警告

c - 进行两次连续扫描

c - GDB 调试器的段错误 - C

c - `c` 中的信号。 while循环的使用

c++ - 计算 SLOC GCC C/C++ Linux

c - 在 scanf() 之后,我如何 "delete"无用