C语言 getchar()在UNIX和Windows上具有非典型模式



我想进入记录用户的输入,将其打印为*,直到按下Enter键。为此,我禁用键盘的回声和规范模式,然后使用一些这样的代码:

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("%dn", c);
    }
    return 0;
}

Windows

#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("%dn", c);
    }
    return 0;
}

unix的结果是,每次我按Enter时,都会获得数字10。这很完美。但是Windows的结果是:

  1. 第一次按ENTER,printf("%dn", c)替换%d nothing。
  2. 第二次我按Enter,printf("%dn", c)替换%d替换为13。

我认为问题可能与Windows中的新系列字符表示为CR LF,但我不知道该如何处理以检测到Enter键以进行操作以进行操作代码工作的第一个片段。

在unix上,在termiosc_iflag中禁用ICRNL位。然后,您将在两个平台上获得'r'

在Windows中,您可以使用conio.h中声明的getch()而不是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;
}

最新更新