【问题标题】:Is there a way to get text as soon as possible without waiting for a newline?有没有办法在不等待换行符的情况下尽快获取文本?
【发布时间】:2010-12-12 01:17:08
【问题描述】:

我正在使用 C。我编写了一个非常简单的程序,它使用 getchar() 和 putchar() 或 printf() 打印回输入。有什么方法可以让用户在输入一个键后立即注册它,而无需等待输入?让我展示一下:

目前,如果用户键入“abc”然后按 Enter,程序会打印“abc”和换行符,并继续等待更多输入。我想在用户输入“a”后立即打印“a”并等待更多输入。我不确定这是否必须在源代码中完成,或者是否必须在 Windows 命令行中进行更改。

以防万一,这里是源代码:

#include <stdio.h>

int main()
{
    int c;

    while ((c = getchar()) != EOF) {
        putchar(c);
    }
    return 0;
}

【问题讨论】:

    标签: c windows command-line input


    【解决方案1】:

    如果您使用的是 Visual Studio,则可以使用 getch()

    【讨论】:

      【解决方案2】:

      如果您使用的是 Visual Studio,则有一个名为 conio (#include &lt;conio.h&gt;) 的库,它定义了 kbhit() 函数和 getch()。

      否则,在 Windows 上,仍有可能使用 Windows SDK 中的函数(ReadConsoleInput() 等),但这需要更多代码(尽管一旦完成并且如果正确完成,它可以随时重复使用)

      【讨论】:

      • 那么就没有跨平台的方式了吗?
      【解决方案3】:

      在这个简单的情况下,其他答案应该适合你。

      一般的解决方案是禁用行缓冲。这取决于特定的控制台;以下示例仅适用于 Windows(未经测试):

      #include <windows.h>
      
      int main() {
          HANDLE hConsole = GetStdHandle(STD_INPUT_HANDLE);
          DWORD mode;
          GetConsoleMode(hConsole, &mode);
          SetConsoleMode(hConsole, mode & ~ENABLE_LINE_INPUT);
          // ...
      }
      

      我假设标准C库函数是按照ReadConsole和朋友来实现的;如果没有,这甚至可能不起作用。 (我目前在 Linux 上,所以我无法对此进行测试。)

      【讨论】:

        【解决方案4】:

        在 Linux 上,您可以接管终端:

        #include <stdio.h>
        #include <ctype.h>
        #include <termios.h>
        
        system("stty raw"); /* raw output to terminal, direct feedback */
        system("clear"); /* clear screen */
        
        printf("Press a key");
        answer = getchar();
        
        system("stty cooked"); /* revert back*/
        

        【讨论】:

        猜你喜欢
        • 2015-06-22
        • 1970-01-01
        • 2010-11-04
        • 2015-11-02
        • 2022-06-15
        • 1970-01-01
        • 2018-12-16
        相关资源
        最近更新 更多