如果输入(整数)为空,则忽略"输入" -Key

时间:2014-10-24 08:29:30

标签: c

我正在搜索问题,但我从未找到问题的答案。 我有一个问题,当你在等待scanf的整数输入时,但在写任何整数或其他任何东西之前你开始发送垃圾邮件“输入”-Key,它会一直使换行符。

我想只要你等待输入但没有写任何内容而你按下“输入”键然后它不应该换行,它应该保持在同一行..

到目前为止我的代码(只有一部分):

printf("\n> ");
scanf("%d", &choice);
while ((ch = getchar()) != '\n' && ch != EOF);

(选择变量声明为整数)

有了这个,我正在从缓冲区中清除换行符,但它仍然在下一行中跳过..我也尝试过do-while但是当没有输入时你仍然会创建一个换行符并按下“回车” -key。

我希望你能帮助我。

1 个答案:

答案 0 :(得分:0)

每当您第一次使用C中的函数时,您应该始终阅读并完全理解 the manual。这解释了原因。

根据the manual

  

除非转换规范包含[cCn转换说明符,否则应跳过输入空白字符(由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();