逃离C中逃离的“白色空间”

时间:2010-09-07 19:59:26

标签: c printf scanf

我真的很确定如何解释这个问题,但我会试一试。

我的程序中有这行代码:

scanf (" %c", &character);

注意%c之前的空格。这应该保持scanf不将最后一个ENTER键解释为一个字符。这可行,但是在此行及其生成的printf输出之后,程序将不会继续执行,直到我提供另一个字符然后按ENTER键。之后它忽略所有scanf并在没有任何用户输入的情况下打印所有printf输出。那有意义吗。我是C新手,所以我确定我错过了一些简单但我找不到任何解决方案。

谢谢!

3 个答案:

答案 0 :(得分:2)

标准输入被缓冲。

在刷新(标准输入)之前,您的代码将看不到缓冲区 当缓冲区已满或插入'\ n'(输入密钥)时会发生这种情况。

因为scanf()是阻塞I / O调用。应用程序将等待输入(无限期)。因此,使代码看起来已经停滞不前。

IMHO

您不应该尝试解释代码前面部分中发生的事情。这会将您的代码耦合到您可能无法控制的其他输入。您的输入应该读取所​​需的一切,而不是更多。

例如:如果您要求用户输入字符,请按Enter键。您应该删除该字符,然后从输入流中输入。您不应期望流的下一个用户为您整理(或补偿您的代码)。

printf("Enter (Y/N)\n");
scanf("%c", &character);
scanf("%*[^\n]"); // Ignore everything to the end of line.
                   // Assuming you have told the user you will ignore
                   // extraneous characters. The next input should now
                   // expect only what they need.

答案 1 :(得分:0)

试试这个:

scanf ("\n%c", &character);

它应该“消耗”缓冲区中的\n字符,然后等待新的字符。

答案 2 :(得分:0)

之前的 scanf来电中,使用scanf("%c\n", &character);之类的内容来输入换行符。与下次需要输入时等待处理它相比,这通常不易出错。

相关问题