gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:31:03 25 4
gpt4 key购买 nike

所以我读了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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com