gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:55:00 26 4
gpt4 key购买 nike

我想记录用户的输入,将其打印为 * 直到按下 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("%d\n", 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("%d\n", c);
}

return 0;
}

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

  1. 我第一次按 ENTER 键时,printf("%d\n", c) 什么都不替换 %d
  2. 我第二次按 ENTER,printf("%d\n", c)%d 替换为 13。

我认为这个问题可能与换行符在 Windows 中表示为 CR+LF 有关,但我不知道如何处理这个以检测第一次按下 ENTER 键以进行第一段代码工作。

最佳答案

在 Unix 上,禁用 termiosc_iflag 中的 ICRNL 位。然后你将在两个平台上得到 '\r'

关于c - 在 UNIX 和 Windows 上使用非规范模式的 getchar(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46142246/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com