gpt4 book ai didi

c - 为什么 scanf 在按下 Enter 键时将控制权返回给程序?

转载 作者:行者123 更新时间:2023-12-05 09:22:04 24 4
gpt4 key购买 nike

我写了下面的程序。

void main()
{
int *piarrNumber1 = (int *) calloc(1, sizeof(int));
int iUserInput = 0;

scanf("%d", &iUserInput);
piarrNumber1[(sizeof piarrNumber1 / sizeof(int)) - 1] = iUserInput;
printf("\n%d\n", piarrNumber1[0]);
}

我在键盘上输入“3”,然后按 TAB。什么都没发生。然后,我按下 Enter 键。我打印出“3”,程序结束。

如果“TAB”[Horizanotal Tab] 和“Enter”[Newline] 都是空白字符,为什么它们的行为不同?

最佳答案

详细信息是特定于操作系统的(因为标准 C99 不知道终端)。

我假设您使用的是 Linux

首先,stdio(3)正在缓冲标准输入流和大多数其他 FILE*溪流。您可以尝试使用 setvbuf(3) 来更改它,但这只会影响输出缓冲。

更重要的是,当 stdin (实际上是它使用的文件描述符,即 STDIN_FILENO 通常是 fileno(stdin) 的值)是一个终端(参见 isatty(3) 来测试) , linux 内核通常对终端进行行缓冲(所谓的 cooked mode )——至少要处理 backspace 键。您可以通过将 tty 切换到原始模式来更改它(就像 emacsvimnano 这样的每个编辑器都会做的)。参见 this question .但是你应该在你的程序退出之前重置熟模式。

因此在正常情况下,会发生两个级别的缓冲:在内核中用于终端的线路规程,以及在 libc 中。用于缓冲 stdin

阅读tty demystified页面和 Text Terminal HowTo

在实践中,如果您想要复杂的终端输入,请使用像 ncurses 这样的库或 readline (不要费心只使用 termios)

另见 stty(1) & termios(3) & tty_ioctl(4) ;了解 ANSI escape codes .

请注意,此行缓冲在两个级别(libc 和内核)是特定于 ttys 的。当stdinpipe(7) (如 echo foo | yourprogram )或文件(如 yourprogram < yourinputfile.txt )情况不同。

简而言之,ttys 很难理解,因为它们模仿了 1950 至 70 年代复杂而神秘的硬件设备。

关于c - 为什么 scanf 在按下 Enter 键时将控制权返回给程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29057882/

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