即使关闭缓冲,getchar 也不会 return
getchar does not return even though buffering is turned off
我在 Linux 3.12、GCC 4.8 的控制台中编译并运行这个简单的程序:
#include <stdio.h>
main() {
setvbuf(stdin, NULL, _IONBF, 0);
printf("%c\n", getchar());
}
运行程序并按任意字母,程序不会退出,除非我按回车键。
是什么阻止了 getchar() 的运行?某处是否有隐藏缓冲区?
问题是您的终端正在缓冲输入。在您的终端发送通过它接收到的输入之前,您的程序无法看到它——默认情况下,它在看到换行符之前不会通过它。
如果您在 Linux 上 运行 bash,运行 stty -icanon
应该更改您的终端设置以直接传递所有输入而不需要换行符.
终端正在执行缓冲。在您按下回车键之前,终端实际上不会将该行写入前台程序的标准输入。
要查看程序执行您期望的操作,您只需 运行 echo 'a' | ./myprog
。它将立即退出并打印单个字符。
我在 Linux 3.12、GCC 4.8 的控制台中编译并运行这个简单的程序:
#include <stdio.h>
main() {
setvbuf(stdin, NULL, _IONBF, 0);
printf("%c\n", getchar());
}
运行程序并按任意字母,程序不会退出,除非我按回车键。
是什么阻止了 getchar() 的运行?某处是否有隐藏缓冲区?
问题是您的终端正在缓冲输入。在您的终端发送通过它接收到的输入之前,您的程序无法看到它——默认情况下,它在看到换行符之前不会通过它。
如果您在 Linux 上 运行 bash,运行 stty -icanon
应该更改您的终端设置以直接传递所有输入而不需要换行符.
终端正在执行缓冲。在您按下回车键之前,终端实际上不会将该行写入前台程序的标准输入。
要查看程序执行您期望的操作,您只需 运行 echo 'a' | ./myprog
。它将立即退出并打印单个字符。