2014-11-06 78 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