提问人:Romildo 提问时间:2/13/2023 最后编辑:Romildo 更新时间:2/13/2023 访问量:98
在正确的位置将输入回声输入到输出中
Echo input into output, at the right place
问:
我想在读取程序的那一刻将给定给程序的输入插入到其输出中。
例如,给定程序:
#include <stdio.h>
int main() {
double x, y;
printf("Soma de dois números:\n");
printf("Digite o primeiro número: ");
scanf("%lf", &x);
printf("Digite o segundo número: ");
scanf("%lf", &y);
double soma = x + y;
printf("%lf + %lf = %lf\n", x, y, soma);
return 0;
}
当它使用输入重定向运行时,我希望将输入插入到输出中,如下所示:
$ echo -e "10\n25\n" | ./a.out
sum of two numbers
first number: 12
second number: 25
12.000000 + 25.000000 = 37.000000
是否有任何库或工具可以帮助我?
编辑上下文:我打算用它来纠正编程课程中的程序练习。我想查看/显示程序输入和输出,就好像它在交互式控制台中运行一样,输入是交互式键入的,尽管输入是从文本文件重定向的。
答:
正如我在评论中指出的那样:
没有一种简单的方法可以做到这一点。问题在于,当您在终端键入时,终端驱动程序会回显键入的字符。当具有 I/O 重定向(从管道或文件)时,不涉及终端驱动程序,并且磁盘驱动程序和管道驱动程序都不会回显到标准输出。
一种选择可能是使用伪终端作为程序的输入——但我没有尝试过,所以这可能不起作用。它的设置也相当繁琐(尽管 Linux 上可能有一个实用程序,特别是可以完成这项工作)。
或者,您可以测试输入是否为终端,如果它是终端,则不做任何特殊操作,如果是,则回显输入的结果。POSIX 函数 isatty()
确定给定的文件描述符是否为终端。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
printf("Enter a number: ");
double d;
if (scanf("%lf", &d) != 1)
{
fprintf(stderr, "Failed to read a number!\n");
exit(EXIT_FAILURE);
}
if (!isatty(STDIN_FILENO))
printf("%lf\n", d);
printf("You entered: %lf\n", d);
return 0;
}
将其保存为源文件后,我可以运行:tty47.c
$ gcc -O3 -g -std=c11 -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes -fno-common tty47.c -o tty47
$ tty47
Enter a number: 2.718282
You entered: 2.718282
$ echo "3.141593" | tty47
Enter a number: 3.141593
You entered: 3.141593
$ tty47 <<<'1.618034'
Enter a number: 1.618034
You entered: 1.618034
$
第一次运行接受我在终端键入的输入,并由终端驱动程序回显。另外两个运行知道输入分别来自管道和文件,并且它们会回显输入。请注意,不能保证回声与用户输入的内容完全相同——我通过输入小数点后 6 位的数字来作弊。使用较少的地方,你会得到尾随的零;使用更多,结果是四舍五入的。您必须决定这是否重要。
另一种策略是读取输入 using or equivalent 并回显每个字符,如果输入不是终端,则使用 or equivalent 回显每个字符,然后用于解析数据。这绝对是更繁琐的。getchar()
putchar()
sscanf()
评论
scanf
scanf
fgets
sscanf
isatty()
isatty()