【问题标题】:Input only works after pressing enter?输入只有在按回车后才有效?
【发布时间】:2016-05-06 21:34:00
【问题描述】:

对不起,我是新手,所以答案可能很明显,但是.. 有人可以向我解释为什么我的代码需要输入,只有当我按下回车然后输入我的字母作为 else if 时才有效?

#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”,它会正确响应“干得好!这是正确的答案!”。这可能是显而易见的,因为我对编码还是很陌生,但感谢任何帮助。

【问题讨论】:

  • 我已从您的标题中删除了标签。在 StackOverflow 上,我们有……嗯,标签,它们做的事情完全相同,而且可以很容易地被计算机传递,并有助于确保每个人对相同的事物使用相同的名称。

标签: c input


【解决方案1】:

您正在阅读两个字符——一个在 Y 分支,一个在 N 分支。尝试类似

int c;  /* pop quiz: why int? */
c = getc(stdin);
if (c == 'N') ...

更新也就是说,您仍然需要输入 RETURN 才能输入角色。但现在逻辑不正确。一旦逻辑正确,请查看终端驱动程序的“原始”和“稀有”模式。

【讨论】:

  • 缺少地址“有人可以向我解释为什么我的代码需要输入,只有在我按下回车时才有效......”
  • @chux 哈,我在你的评论之前添加了更新:-)
  • 嗯 .. 我的 comment 在 49:44,您的最新更新是在 50:25 - Ships that pass in the night p1!
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    终端输入和输出默认是行缓冲的。

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

    【讨论】:

      猜你喜欢
      • 2015-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-28
      • 2012-11-25
      相关资源
      最近更新 更多