2

必要时在 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 缓冲区?

4

3 回答 3

4

将您要完成的任务概念化为“我如何阅读和丢弃用户可能在我关心的内容之后键入的任何垃圾”,您将有更好的运气,这将引导您构建诸如

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

而且,您可以通过一开始不使用来避免整个问题,出于其他几个原因scanf,这是一个好主意。阅读整行,如果你有,或者如果你没有,并手动解析它们。getlinefgets

于 2012-12-01T04:02:37.717 回答
-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);
}

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

于 2012-12-01T03:45:41.243 回答
-1

没有scanf缓冲区,但有一个“输入”缓冲区。清除它的最佳方法是使用rewind(stdin). 但是,如果输入已被重定向,这种方法就会出现问题。

于 2012-12-01T04:02:50.293 回答