如何使用键盘在终端输入中正确插入换行符('\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()
并操纵 VMIN
和 VTIME
参数
您使用的是什么平台?
考虑以下 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()
并操纵 VMIN
和 VTIME
参数
您使用的是什么平台?