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

在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); 

是否应该关注缓冲区溢出或其他安全问题? 似乎没有关于在scanf中使用星号的正式文档用于C( 编辑这不是真的),所以我很难找到输入的额外字符究竟发生了什么。 有没有更好的方法清除C中的scanf缓冲区?

你可以更好地概念化你想要完成的任务,因为“我如何阅读和丢弃用户可能在我关心之后键入的任何垃圾”,这将引导你构建如

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

但是,你可以通过不首先使用scanf来避免整个问题,这是其他几个原因的好主意 。 如果你有的话,用getline读取整行,或者如果你没有,则读取fgets ,并手动解析它们。

如果要清除scanf缓冲区,请执行以下操作

 char c; for(int i = 0; i < 5; i++) { scanf("%c", &c); while(getchar() != '\n') continue; } 

要么

 char c; for(int i = 0; i < 5; i++) { scanf("%c", &c); fflush(stdin); } 

但是,你的代码很危险......

没有scanf缓冲区,但有一个“输入”缓冲区。 清除它的最好方法是使用rewind(stdin) 。 但是,如果输入已被重定向,则此方法存在问题。