我有一个C程序,它有一个scanf
调用,然后调用read
。我想用printf
来提供两个输入。将stdin重定向两次?
printf 10 | program_name
由于某种原因不起作用; scanf
正确拾取10,但read
调用默认为“”,甚至不要求输入。
我想使用printf
两次,一次将输入传递给scanf
,第二次将输入传递给read
。我怎样才能做到这一点?
我有一个C程序,它有一个scanf
调用,然后调用read
。我想用printf
来提供两个输入。将stdin重定向两次?
printf 10 | program_name
由于某种原因不起作用; scanf
正确拾取10,但read
调用默认为“”,甚至不要求输入。
我想使用printf
两次,一次将输入传递给scanf
,第二次将输入传递给read
。我怎样才能做到这一点?
作为一个可怕的黑客,你需要确保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之后调用读取并不会太糟糕。
如果程序显示'#define BUFSIZE 256',但命令说'scanf(“%d”,&length)',我应该使用256还是4? – LonelyWebCrawler 2014-11-06 02:44:24
您应该使用底层缓冲区大小,它与程序中定义的宏无关。这将取决于系统,可能是4096或8192. – 2014-11-06 06:13:10
谢谢,这工作。 – LonelyWebCrawler 2014-11-16 17:26:42
scanf将在其缓冲区中消耗大量输入。一般来说,尝试将printf与write或scanf与read混合是一个坏主意。 – 2014-11-06 01:27:04
不幸的是我没有编写程序。 – LonelyWebCrawler 2014-11-06 01:27:16