输入仅在按Enter后才有效?

时间:2016-05-06 21:34:00

标签: c input

抱歉,我是新手,所以答案可能很明显但是...... 有人可以向我解释为什么我的代码需要输入,只有当我按下输入然后输入我的字母为其他时才有效吗?

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
    printf("Question?\nType Y for yes or N for no");

    if(getc(stdin) == 'N')
       printf("That is not the correct answer\n");

    else if(getc(stdin) == 'Y')
       printf("Good Job! That is the correct answer\n");

    else
       printf("That's not a valid answer\n");

    return 0;
}

如果我输入“N”,它会正确回应“那不是正确的答案”,但如果我输入“Y”,它会说“这不是一个有效的答案”;但是,如果我按回车然后键入“Y”,它会正确回答“好工作!这是正确答案!”。这可能是显而易见的事情,因为我再次对编码很新,但感谢任何帮助。

3 个答案:

答案 0 :(得分:9)

你正在阅读两个字符 - 一个在Y分支,一个在N分支。尝试像

这样的东西
int c;  /* pop quiz: why int? */
c = getc(stdin);
if (c == 'N') ...

更新那就是说,你仍然需要输入RETURN来获取角色。但是现在逻辑是不对的。一旦你掌握了逻辑,就要看看&#34; raw&#34;和#&#34;罕见&#34;终端驱动程序的模式。

答案 1 :(得分:6)

默认情况下,终端处于线路模式。没有保证终端甚至支持其他任何东西。 C语言是一种标准,旨在与最简单的设备一起使用,并且不会假设您的终端具有复杂的功能,如光标寻址,擦除或字符级控制。

如果您想要任何花哨的东西,您可以离开纯C领域并开始使用您拥有的特定硬件的特征信息或平台上库的可用性。

答案 2 :(得分:0)

默认情况下,终端输入和输出是行缓冲的。

您可以将输入设置为单字符模式(与行模式相反),但每种操作系统的方法都不同 - 在Linux上,您可以使用ioctl调用来重新配置输入,您可以更改{ {1}}和vtime参数表示您一次只需要一个字符 - 此外,请参阅此问题termios VMIN VTIME and blocking/non-blocking read operations