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

How to insert newline ('\n') in terminal input with keyboard properly?

考虑以下 C 程序:

#include <stdio.h>

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

并将以下内容视为所需的输入:

LINE1

LINE2

如果我开始在终端 window 中输入输入,一旦我按下 enter/return 键,到目前为止的输入就会打印到屏幕上;我不希望发生这种情况。 (似乎一旦按下 enter/return 键,终端就会将输入的所有内容发送给程序)

我希望能够在终端中输入所有行,然后在一个地方看到所有输出,而不是在每行末尾按回车键后打印输出。

有没有办法在不将输入发送到应用程序的情况下插入换行符?

大多数系统使用输入缓冲,即输入被缓冲并且在输入为换行符之前不会被发送到应用程序。

据我所知,当输入是换行符时,无法阻止系统将缓冲数据发送到应用程序。

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

类似于:

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),然后您再进行处理。

I would like to be able to type all the lines into the terminal and then see the output all in one place, instead of having the output be printed once I hit enter at the end of every line

我不确定我明白你想做什么。简短的回答是肯定的,你可以。但是我不清楚你想要的行为,所以至少对我来说很难说你怎么能做你想做的事

您可以在循环中处理字符 c,您可以在读取时禁用 ECHO,并且仅在需要时写入,您可以按照 here if you are using Windows[=16 中所述管理控制台处理=]

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

您使用的是什么平台?