我有一个等待用户输入的C程序

#include <stdio.h>

int main()
{   
    getchar();

    return 0;
}

现在我运行它,输入一些汉字,比如测试测试.然后现在我点击退格键,我发现我不能完全删除这些字符(留下一些空白)

我发现termios的标志设置为IUTF8,但为什么它不起作用?


更新日期:2022/12/31:

我正在试着更详细地描述我的问题,我有一个这样的计划

png1

现在我运行它并输入一些中文字符(没有Enter键)

png2

然后我一直按退格键(直到什么都不能再擦掉),但一半的内容仍然显示在我的屏幕上.这太不正常了,我怎么才能让擦除运行得好呢?

png3

我知道这对你来说是个愚蠢的问题.我只是想让输入一些UTF8字符(如中文字符)更舒服.

我发现shell 可以很好地处理这一点,我如何才能使我的程序执行得同样好呢?

顺便说一句,这是我的语言环境输出

LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=zh_CN.UTF-8
LC_TIME=zh_CN.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=zh_CN.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=zh_CN.UTF-8
LC_NAME=zh_CN.UTF-8
LC_ADDRESS=zh_CN.UTF-8
LC_TELEPHONE=zh_CN.UTF-8
LC_MEASUREMENT=zh_CN.UTF-8
LC_IDENTIFICATION=zh_CN.UTF-8
LC_ALL=

推荐答案

使用GNU readline可以提供类似shell 的界面,具有Tab自动完成、正确的输入处理等功能.

要编译以下示 routine 序,请确保安装了libreadline-dev包.运行该程序所需的ReadLine库将已经安装,因为许多默认安装的应用程序已经需要它.

// SPDX-License-Identifier: CC0-1.0
// Compile using
//    gcc -Wall -O2 $(pkg-config --cflags readline) example.c $(pkg-config --libs readline) -o example

#define  _GNU_SOURCE
#include <stdlib.h>
#include <locale.h>
#include <readline/readline.h>
#include <readline/history.h>
#include <stdio.h>

int main(void)
{
    char *line;

    setlocale(LC_ALL, "");

    while (1) {
        line = readline(NULL);  // No prompt

        // Input line is in 'line'; exit if end of input or empty line.
        if (!line || *line == '\0')
            break;

        // Do something with 'line'

        // Discard the dynamically allocated line
        free(line);
    }

    return 0;
}

在使用GNU Readline库时,该库接管标准输入,并在终端(Termios)级别处理字符删除(和许多其他事情).它在处理文件和管道输入时也工作得很好,例如bash个shell 就是用来进行交互输入的.

C++相关问答推荐

如何避免重新分配指针数组时,我们从一开始就不知道确切的大小

sizeof结果是否依赖于字符串的声明?

在C语言中使用scanf()时我无法理解的警告

使用NameSurname扫描到两个单独的字符串

C:二进制搜索和二进制插入

使用GOTO从多个嵌套循环C继续

将 struct 变量赋给自身(通过指针取消引用)是否定义了行为?

带有sigLongjMP中断I/O的异常处理程序

在C++中通过空指针隐式访问常量变量的值

将宏值传递给ARM链接器,该链接器将变量放置在特定位置

等同于铁 rust 的纯C语言S未实现!()宏

处理来自浏览器的HTTP请求

将字符串数组传递给C中的函数:`str[dim1][str_size]`vs`*str[dim1]`

试图创建一个基本的Word克隆,但遇到了障碍

pthread_create的用法

为什么我的旧式&q;函数在传递浮点数时会打印2?

问题:C#Define上的初始值设定项元素不是常量

如何使crc32的结果与cksum匹配?

If语句默认为true

添加/删除链表中的第一个元素