【发布时间】:2012-11-19 07:38:11
【问题描述】:
在 scanf() 中使用 %*c 在必要时清除缓冲区有什么危险吗?
例如:
char c;
for (int i = 0; i < 5; i++) {
scanf("%c%*c", &c);
}
或者
char* str;
char c;
int i;
scanf("%s", str);
scanf("%d%*c", &i);
scanf("%c%*c", &c);
是否应该担心缓冲区溢出或其他安全问题? 对于 C (EDIT 这不是真的),似乎没有正式的文档来说明如何在 scanf 中使用星号(EDIT 这不是真的),所以我很难找出额外的字符会发生什么被输入。 有没有更好的方法来清除 C 中的 scanf 缓冲区?
【问题讨论】:
-
@melpomene,我在 StackOverflow 上见过的最好的评论
-
@melpomene 我的错误,我猜“官方”是指官方 C 文档,但我刚刚意识到它实际上并不像 JavaDocs for Java 那样存在。我仍然想知道被压制的角色会发生什么?它是否写入 Linux 机器上的 /dev/null 之类的东西?
-
你从来没有说过“官方”。如果你想要官方(不付钱),open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf 是你最好的选择(它是 C99 标准加上一些技术勘误)。
-
被抑制的字符被简单地忽略;读取后被覆盖或以其他方式丢失。