我正在搜索问题,但我从未找到问题的答案。 我有一个问题,当你在等待scanf的整数输入时,但在写任何整数或其他任何东西之前你开始发送垃圾邮件“输入”-Key,它会一直使换行符。
我想只要你等待输入但没有写任何内容而你按下“输入”键然后它不应该换行,它应该保持在同一行..
到目前为止我的代码(只有一部分):
printf("\n> ");
scanf("%d", &choice);
while ((ch = getchar()) != '\n' && ch != EOF);
(选择变量声明为整数)
有了这个,我正在从缓冲区中清除换行符,但它仍然在下一行中跳过..我也尝试过do-while但是当没有输入时你仍然会创建一个换行符并按下“回车” -key。
我希望你能帮助我。
答案 0 :(得分:0)
每当您第一次使用C中的函数时,您应该始终阅读并完全理解 the manual。这解释了原因。
根据the manual:
除非转换规范包含
[
,c
,C
或n
转换说明符,否则应跳过输入空白字符(由isspace指定)
因此,首先跳过尽可能多的空白区域,即可执行d
转换规范(d
在%d
中)。这就是fscanf
如何记录执行。如果您想要不同的行为,那么您必须编写一些额外/其他代码。我已经阅读并完全理解了 the manual,甚至在此之前多次提到它(在回答与此问题非常类似的问题时,我可以补充一下)所以我可以说明你可能想写这样的东西,以便像其他控制台一样显示你的提示:
int c;
do {
printf("> ");
fflush(stdout);
c = getchar();
} while (isspace(c));
/* Check for EOF */
if (c == EOF) {
/* XXX: Clean up resources before exiting
* (or handling EOF however else you handle it) */
exit(0);
}
/* Put the non-space character that terminated the loop back into stdin */
ungetc(c, stdin);
/* Check scanf success */
if (scanf("%d", &choice) == 1) {
/* Do what you will with choice here */
}
/* Discard any remaining characters up to and including the first '\n' */
do {
/* Some consider it poor style to put side-effects into condition expressions... */
c = getchar();
} while (c != EOF && c != '\n');
P.S。如果您阅读并完全理解 the manual,您可能会发现可以使用此代替最后一个循环:scanf("%*[^\n]"); getchar();