如何使用键盘在终端输入中正确插入换行符'\ n'?

问题描述

考虑以下C程序:

#include <stdio.h>

int main() {
    int c;
    while ((c = getchar()) != EOF)
        putchar(c);
    return 0;
}

,并考虑以下内容作为所需输入:

LINE1

LINE2

如果我开始在终端窗口中输入输入内容,则按下Enter / return键后,到目前为止的输入内容将被打印到屏幕上。我不想发生。 (似乎按下Enter / return键后,终端会将键入的所有内容发送给程序)

我希望能够在终端中输入所有行,然后将输出全部显示在一个地方,而不是在我按每行末尾的回车键时打印输出。

是否可以在不将输入发送到应用程序的情况下插入换行符?

解决方法

大多数系统使用输入缓冲,即输入被缓冲,直到输入为换行符后才发送给应用程序。

AFAIK无法阻止输入为换行符时系统将缓冲的数据发送到应用程序。

因此,您需要在系统缓冲区系统之上实现自己的缓冲区系统。

类似的东西:

int main() {
    int c;
    size_t capacity = 64;
    size_t write_index = 0;
    char *buffer = malloc(capacity);
    assert(buffer != NULL);

    // Buffer input
    while ((c = getchar()) != EOF)
    {
        if (write_index == capacity)
        {
            // Increase buffer
            capacity = 2 * capacity;
            char *tmp = realloc(buffer,capacity);
            assert(tmp != NULL);
            buffer = tmp;
        }
        buffer[write_index] = c;
        ++write_index;
    }

    // Process input
    for (size_t i = 0; i < write_index; ++i)
    {
        putchar(buffer[i]);
    }

    free(buffer);

    return 0;
}

然后所有输入将被缓冲,直到您输入EOF(即ctrl-d或ctrl-z),然后再进行处理。

,

我希望能够在终端中输入所有行,然后 然后将输出全部放在一个地方,而不是将输出 我在每行末尾按Enter键后打印

我不确定我知道你想做什么。简短的回答是,可以。但是您想要的行为对我来说并不明确,因此至少对我而言很难说出如何做自己想做的事

您可以在循环内处理char c,可以在读取时禁用ECHO,并且仅在需要时才可以写入,可以按照here if you are using Windows

中的说明管理控制台处理。

在Unix及其衍生版本下,该模型有所不同,因为Linux / Unix / Mac没有控制台。您使用ioctl()并操纵VMINVTIME参数

您正在使用什么平台?

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...