C程序需要按下回车键才能读取字符

简介: C程序需要按下回车键才能读取字符

当编写涉及从终端输入字符的C程序时,有时会遇到需要按下回车键才能读取字符的问题。这是因为默认情况下,终端通常处于行缓冲模式,需要等待用户按下回车键才会将输入的字符发送给正在运行的程序。这可能会导致一些不便,尤其是当程序期望立即读取字符时。

问题:为什么C程序需要按下回车键才能读取字符?

这个问题的根本原因是终端的默认行为。终端处于行缓冲模式,这意味着它会收集用户的输入,直到按下回车键,然后才将整行文本发送给正在运行的程序。

解决方案:禁用行缓冲模式

为了允许C程序立即读取输入字符,我们可以禁用终端的行缓冲模式。这可以通过以下两种方式实现:

1. 使用stty命令:终端中运行以下命令,可以禁用行缓冲模式:

 stty -icanon

  这会将终端设置为非规范模式,使得字符会立即传递给正在运行的程序,而不需要按下回车键。

  要还原终端设置,可以运行以下命令:

  stty icanon

2. 在C程序中使用系统调用:你还可以在C程序中使用系统调用来更改终端属性,从而禁用行缓冲模式。这可以通过`tcgetattr`和`tcsetattr`等函数来实现。

  以下是一个使用`tcgetattr`和`tcsetattr`的简单示例:  

#include <stdio.h>
   #include <termios.h>
   #include <unistd.h>
   int main() {
       struct termios term;
       tcgetattr(STDIN_FILENO, &term);
       term.c_lflag &= ~(ICANON | ECHO); // 禁用规范模式和回显
       tcsetattr(STDIN_FILENO, TCSANOW, &term);
       char c;
       while (1) {
           c = getchar();
           if (c == 'q') break; // 退出循环
           printf("You entered: %c\n", c);
       }
       // 恢复终端设置
       term.c_lflag |= (ICANON | ECHO);
       tcsetattr(STDIN_FILENO, TCSANOW, &term);
       return 0;
   }

  该程序会禁用规范模式和回显,从而使字符立即可用,并在按下 'q' 键后退出。

无论你选择哪种方法,禁用行缓冲模式都可以让你的C程序更灵活地处理字符输入,而不必等待用户按下回车键。但请注意,更改终端设置可能会影响终端的行为,因此应该根据需要慎重使用。

目录
相关文章
显示按下的键的编码的汇编源代码
显示按下的键的编码的汇编源代码
|
6月前
MFC编程 -- 判断是否按下ctrl和shift键
MFC编程 -- 判断是否按下ctrl和shift键
119 0
|
Web App开发 C++
c++ 实现不在同一程序内,在光标处(当前有焦点的窗体输入框)输入字符
c++ 实现不在同一程序内,在光标处(当前有焦点的窗体输入框)输入字符
106 1
|
Unix C++ iOS开发
C++如何从键盘输入文件结束符
C++如何从键盘输入文件结束符
|
Unix C语言 C++
正确理解回车与换行
回车 \r 本义是光标重新回到本行开头 换行 \n 本义是光标往下一行(不一定到下一行行首)
181 0
|
Shell
SHELL中如何获得指定字符的位置及正确的截取动作
SHELL中如何获得指定字符的位置及正确的截取动作
336 0
|
开发工具 Android开发
粘贴到vi/vim的代码,怎样避免向右不断缩进,保持原来的格式?解决vi/vim在粘贴中会在行首多很多缩进和空格的问题。
SecureCRT会将你原来的文本原封不动的按照字符串的样式发送给服务器。所以当你的服务器上的vi/vim设置为autoindent的话,在 i 模式下,那么它会将SecureCRT传输而来的这些字符串再进行一下缩进。
1887 0
|
Windows
Windows 技术篇:cmd使用过程中输入字母突然不显示光标的原因与解决方法
Windows 技术篇:cmd使用过程中输入字母突然不显示光标的原因与解决方法
1048 0
Windows 技术篇:cmd使用过程中输入字母突然不显示光标的原因与解决方法
|
开发工具 C++ Ubuntu
使用vi是方向键变乱码 退格键不能使用的解决方法
一、编辑/etc/vim/vimrc.tiny 由于/etc/vim/vimrc.tiny的拥有者是root用户,所以要在root的权限下对这个文件进行修改。很简单,这个文件里面的倒数第二句话是“set compatible”,如下所示:                                            将“compatible”改成“nocompatible”非兼容模式就可以解决方向键变ABCD的问题了。
1395 0