2016-04-14 100 views
0

多輸入我有以下的C程序:運行程序

#include<stdio.h> 
main() 
{ 
    char buf[64]; 
    gets(buf); 
    printf("Your input: %s\n", buf); 
    gets(buf); 
    printf("Your input: %s\n", buf); 
} 

我想將數據發送到使用管道或重定向程序。問題在於程序不會等待第二個輸入新數據。

e.g

$ echo "a" | ./test 

輸出:

Your input: a 
Your input: a 

如何發送讓程序等待在每個用戶輸入使用管道或重定向得到。 P.S我沒有持續寫入/ proc/$ pid/fd/0,我不必更改代碼。

任何幫助,將不勝感激。

+1

1.)不要使用'gets()'。 2.)嘗試'scanf(「%64s」,buf);' 這可以防止緩衝區溢出。可能有更好的解決方案。只是我的第一個想法,你可以使用。 – Enkelli

+0

謝謝,但我不必更改代碼。 –

+0

你不想改變它嗎?或者你不能?對不起,我沒有讀到最後一句話。但我仍然不明白這意味着什麼。 我的第一個答案 - 這不是解決方案,只是一些提示。 – Enkelli

回答

0

如果您使用管道|將數據輸入到命令,它會從終端的(輸入部分)斷開連接。 gets讀取第一行"a\n"並將其作爲"a\0"寫入buf。然後它碰到管道的末端,或EOF(文件的結尾)。

你的第二個gets然後什麼都不做(因爲在EOF之後沒有東西要讀)並且讓buf獨自一人; buf仍然包含"a\0",這是正式印刷。

進一步提示:

  • 在做I/O,可本質上在任何時候失敗了,你必須在每個調用後檢查錯誤,還是壞的事情會發生。訓練自己做到這一點,並節省大量的調試時間。

  • 永遠不要做像gets(buf)這樣的I/O,因爲它會導致緩衝區溢出,這是計算安全性的禍害。如果輸入任意數據,則必須使用可以限制寫入字節數的調用。 gets的手冊頁在頂部包含句子「從不使用此功能」。你可以找到其他更好的函數,read是一個基線,如果你使用C++,會有很多其他的標準解決方案。

+0

'buf'不包含換行符。 –

+0

是的,我已經清除了。 – AnoE