c - 使用 %*c 清除 scanf 缓冲区的危险

标签 c security io buffer

在必要时在 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 中以这种方式在 scanf 中使用星号(编辑这不是真的),所以我很难找出额外的字符究竟发生了什么被输入。 有没有更好的方法来清除C中的scanf缓冲区?

最佳答案

你会更幸运地将你试图完成的任务概念化为“我如何阅读并丢弃用户在我关心的内容之后可能输入的任何垃圾”,这将引导你构建诸如

int c;
while ((c = getchar()) != EOF && c != '\n') ;  /* discard till end of line or EOF */

而且,您可以通过首先不使用 scanf 来避免整个问题,即 a good idea for several other reasons 。使用 getline 读取整行,如果有的话,或者fgets如果不这样做,请手动解析它们。

关于c - 使用 %*c 清除 scanf 缓冲区的危险,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13656134/

相关文章:

c - 使用 openGL ES 1.1 渲染 .h Blender 导出到 iPhone

Spring Security有Ip地址问题

c - 如何计算数字中的位数,包括前导零?

c - kbhit() 和 getch() 和系统 ("cls"的可移植替代方案)

web-applications - 安全在线网络应用程序

java - Android App 中的亚马逊访问凭证

linux - block 文件写入的优点是什么

python - SSH 与 Paramiko : failing to read data

io - 编程(轮询)的I/O,中断驱动的I/O和直接内存访问之间有什么区别。这些形式的I/O OS是否相关?

c - 粉碎堆栈 : Why is this code working?