在UNIX和Windows上使用非规范模式的getchar()

时间:2017-09-10 15:14:18

标签: c windows

我想要记录用户的输入,将其打印为*,直到按下ENTER键。为此,我禁用键盘的echo和canonical模式,然后使用如下代码:

while ((aux = getchar()) != '\n')
{
    buffer[i++] = aux;
    printf("*");
}
buffer[i] = 0;
printf("\n");

此代码在UNIX系统上运行良好,但在Windows中运行不正常。为了猜测问题是什么,我为每个平台编写了这段代码:

UNIX

#include <stdio.h>
#include <termios.h>

int main ()
{
    int c;
    struct termios mode;

    tcgetattr(0, &mode);
    mode.c_lflag &= ~(ECHO | ICANON);
    tcsetattr(0, TCSANOW, &mode);

    while (1)
    {
        c = getchar();
        printf("%d\n", c);
    }

    return 0;
}

#include <stdio.h>
#include <windows.h>

int main ()
{
    int c;
    DWORD mode;
    HANDLE console = GetStdHandle(STD_INPUT_HANDLE);

    GetConsoleMode(console, &mode);
    SetConsoleMode(console, mode & ~(ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT));

    while (1)
    {
        c = getchar();
        printf("%d\n", c);
    }

    return 0;
}

在UNIX中的结果是,每次按ENTER键时,我都会得到数字10.这是完美的。但Windows中的结果是:

  1. 我第一次按ENTER键,printf("%d\n", c)无效地替换%d
  2. 第二次按ENTER键,printf("%d\n", c)%d替换为13。
  3. 我认为这个问题可能与新行字符在Windows中表示为CR + LF的事实有关,但我不知道如何处理这个以检测第一次按下ENTER键时第一段代码工作。

2 个答案:

答案 0 :(得分:2)

在Windows中,您可以使用getch()中声明的conio.h而不是getchar()来获取所需内容。

示例代码:

 #include<conio.h>
 #include<stdio.h>

 int main()
 {
 int aux,i=0,buffer[MAX];
 while ((aux = getch())!=13)
 {
  buffer[i++] = aux;
  printf("*");
}
return 0;
}

答案 1 :(得分:1)

在Unix上,禁用ICRNL的{​​{1}}中的termios位。然后,您将在两个平台上获得c_iflag