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

时间:2012-12-01 03:42:19

标签: 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);

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

3 个答案:

答案 0 :(得分:4)

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

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,并手动解析。

答案 1 :(得分:-1)

如果要清除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);
}

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

答案 2 :(得分:-1)

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