- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
所以我读了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/
所以我需要帮助将 PHP 转换为 SQL。这是当前代码(不是我的),它运行三个 while 循环,最终运行大约需要两分半钟。显然,效率不是很高。我也知道这是旧的 mysql 用法,而不是较新的 mys
所以我读了this question和其他相关问题,我知道检查 scanf 的返回值以避免意外是个好主意。但是我的代码中有以下 scanf: /* * If we don't gobble newl
我是一名优秀的程序员,十分优秀!