终端控制——如何在不输入回车读入字符

本文介绍了一个使用C语言实现的程序,该程序能在不按回车键的情况下读取终端输入的字符。通过调整终端属性并利用ioctl函数检查键盘缓冲区的状态,实现了字符的实时读取功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

摘要:一般情况下,我们在终端输入一些字符,输入的同时可以编辑(增加,删除,修改),然后输入回车,这些字符被送到缓冲区。但是,在more程序和其他的程序中,比如游戏中的快捷键,我们需要的是不用输入回车就可以读取字符。此时,我们就需要了解如何控制终端,使得在不输入回车的情况下就可以读入字符。


首先,我们看一下这个程序的实现:

 

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/ioctl.h>
int kbhit();
int main(int argc, char *argv[])
{
  int i=0;
  int c=' ';
  system("stty raw -echo");
  printf("enter q to quit\n");
  for (;  c!='q';i++)
  {
    if (kbhit())
    {   
      c=getchar();
      printf("\n got %c, on iteration %d",c,i);
    }   
  }
  system("stty cooked echo");
  return 0;
}
int kbhit()
{
  int i;
  ioctl(0,FIONREAD,&i);
  return i;
}

解析:

system:调用shell来执行相关命令

stty raw:将终端设置为阻塞模式,实现实时读取

ioctl:查询键盘缓冲区状态

函数名: ioctl
头文件:#include<sys/ioctl.h>
功 能: 控制I/O设备 ,提供了一种获得设备信息和向设备发送控制参数的手段。用于向设备发控制和配置命令 ,有些命令需要控制参数,这些数据是不能用read / write 读写的,称为Out-of-band数据。也就是说,read / write 读写的数据是in-band数据,是I/O操作的主体,而ioctl 命令传送的是控制信息,其中的数据是辅助的数据。
用 法: int ioctl(int handle, int cmd,[int *argdx, int argcx]);
返回值:成功为0,出错为-1
FIONREAD : 通过由ioctl的第三个参数指向的整数返回当前在本套接口接收缓冲区中的字节数。本特性同样适用于文件,管道和终端。

### Java 中实现控制输入后自动换行 对于Java中的控制输入,在标准情况下,当用户按下回车键时,默认会执行一次换行操作并提交输入的内容。如果希望在特定条件下或者以编程方式处理换行逻辑,则可以采用同的策略。 #### 使用 `JTextArea` 组件 在一个图形界面应用中,比如使用Swing框架开发的应用程序里,可以通过配置 `JTextArea` 来达到自动换行的效果。通过调用 `setLineWrap(true)` 方法可以让文本区域内的文字超出指定宽度时自动折到下一行显示[^1]: ```java import javax.swing.JTextArea; // 创建一个新的 JTextArea 对象,并启用自动换行功能 JTextArea textArea = new JTextArea(); textArea.setLineWrap(true); ``` #### 处理命令行环境下的换行行为 然而,在纯命令行环境下(即涉及GUI组件),通常会直接涉及到“自动”换行的概念,因为每次按Enter键都会触发新的行创建以及可能的数据处理流程。但是,为了模拟某种形式上的“自动”换行体验——例如连续多次读入多行数据而需要手动敲击Enter键来分隔每条记录——则可借助于第三方库或是自定义解析机制。 考虑到这一点,下面是一个简单的例子展示如何利用 `BufferedReader` 和 `InputStreamReader` 结合的方式从键盘获取多行字符串直到遇到某个特殊标记为止: ```java import java.io.BufferedReader; import java.io.InputStreamReader; public class MultiLineInputExample { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringBuilder sb = new StringBuilder(); System.out.println("请输入内容 (输入 'exit' 结束):"); String line; while (!(line = br.readLine()).equals("exit")) { sb.append(line).append("\n"); // 手动追加换行符 } System.out.println("您输入的所有内容:\n" + sb.toString()); } } ``` 这段代码允许用户持续输入直至他们决定结束输入过程(在这里是以输入单词 `"exit"` 作为终止信号)。每当接收到新行之后就会立即附加一个换行字符 `\n` 到累积的结果串上,从而实现了类似于“自动”的换行列举效果。 另外值得注意的是,某些集成开发环境(IDE),像IntelliJ IDEA提供了选项用于调整其内置终端窗口的行为模式,包括但限于开启软包裹特性使得长行能够在视窗边界处自然断裂而是一直延伸下去[^4]。过这类设置仅影响到了IDE内部的日志呈现样式而非实际应用程序运行期间产生的原始输出流本身。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值