2014-11-06 70 views
0

我有一个C程序,它有一个scanf调用,然后调用read。我想用printf来提供两个输入。将stdin重定向两次?

printf 10 | program_name由于某种原因不起作用; scanf正确拾取10,但read调用默认为“”,甚至不要求输入。

我想使用printf两次,一次将输入传递给scanf,第二次将输入传递给read。我怎样才能做到这一点?

+1

scanf将在其缓冲区中消耗大量输入。一般来说,尝试将printf与write或scanf与read混合是一个坏主意。 – 2014-11-06 01:27:04

+0

不幸的是我没有编写程序。 – LonelyWebCrawler 2014-11-06 01:27:16

回答

2

作为一个可怕的黑客,你需要确保scanf的缓冲区已满。喜欢的东西:

{ printf 10; dd if=/dev/zero bs=4094 count=1; 
    echo This text will go to the read if bufsize is 4096; } | program_name 

这里的技术是依靠scanf函数读取第一个4096个字节,以填补其第一次读它的缓冲区,在管道的读取来获得留下的数据。主要问题是它非常脆弱,需要熟悉缓冲区。总的来说,这是一个糟糕的想法,但是在调用相同文件描述符的scanf之后调用读取并不会太糟糕。

+0

如果程序显示'#define BUFSIZE 256',但命令说'scanf(“%d”,&length)',我应该使用256还是4? – LonelyWebCrawler 2014-11-06 02:44:24

+0

您应该使用底层缓冲区大小,它与程序中定义的宏无关。这将取决于系统,可能是4096或8192. – 2014-11-06 06:13:10

+0

谢谢,这工作。 – LonelyWebCrawler 2014-11-16 17:26:42

相关问题