【发布时间】:2016-11-16 14:54:09
【问题描述】:
因此,在下面的代码中,我从用户那里读取一个选项,然后决定是否执行给定的操作:
printf("Do you want to execute %s: ", exe);
char input = getchar();
if (input == 'y') {
return execute(exe);
} return 0;
我遇到的问题是,在char input = getchar() 行之后,一个字符(我假设是回车键或换行符)卡在stdin 中,并且将来调用fgets()(来自@987654326 @) 来自我的 execute() 函数因此吃掉了这个卡住的字符并且不会提示用户输入所需的输入。
现在我可以定义以下函数,如果在调用 execute() 之前为我“吃掉”任何杂散字符...
void iflush() {
int c;
while ((c = getchar()) != EOF && c != '\n') {
continue;
}
}
... 这解决了问题。但是我想知道为什么首先会发生这种情况?有没有更“正确”的方式从stdin 获取char 而不会导致这个流浪字符,然后弄乱我的其他方法?我对 C 语言非常陌生,并且很想确保自己正在学习良好的习惯。
我必须添加一个辅助方法(即使很简单)似乎很奇怪,以防止我的程序中的错误只是记录一些用户输入。我也尝试过使用fgetc(),但同样的问题。
【问题讨论】:
-
您在调用
getchar()的语句之后尝试fflush(stdin);吗? -
是的,什么也没做
-
@VHS 你知道这是一个非常糟糕的建议吗?
fflush(stdin);正在调用未定义的行为。 -
@VHS:请阅读Using
fflush(stdin)了解有关fflush(stdin)的更细致入微的故事——它是在使用Microsoft C 运行时库时在Windows 上定义的,但在其他方面不可移植。 -
解析输入(一般数据)绝对不是一件容易的事,因此编写这样的帮助程序(由于丢失了好字符而损坏,输入正确时返回它们)是很常见的。跨度>