我想要记录用户的输入,将其打印为*
,直到按下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中的结果是:
printf("%d\n", c)
无效地替换%d
。printf("%d\n", c)
将%d
替换为13。我认为这个问题可能与新行字符在Windows中表示为CR + LF的事实有关,但我不知道如何处理这个以检测第一次按下ENTER键时第一段代码工作。
答案 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
。