我想进入记录用户的输入,将其打印为*
,直到按下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的结果是:
- 第一次按ENTER,
printf("%dn", c)
替换%d
nothing。 - 第二次我按Enter,
printf("%dn", c)
替换%d
替换为13。
我认为问题可能与Windows中的新系列字符表示为CR LF,但我不知道该如何处理以检测到Enter键以进行操作以进行操作代码工作的第一个片段。
在unix上,在termios
的c_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;
}