2013-10-16 81 views
1

我有一個功能,調用fgets()stdin作爲流,尋找用戶輸入。但是,在某些情況下,我寧願讓程序決定輸入什麼,而不是要求用戶輸入。如果我能找到一種方法來加載stdin緩衝區之前調用函數與fgets()之前的值,這將允許我不改變包含fgets(),同時仍然採取程序輸入功能?如果是這樣,那麼如何加載緩衝區stdin加載stdin緩衝區

+0

你想推送一些字符到'stdin'緩衝區,對嗎?包括行尾字符? – Floris

+0

是的。我認爲這應該工作。你會怎麼做? –

+0

爲什麼在調用'fgets()'之後不直接連接字符串? – fvdalcin

回答

2

我有一個很棒的技巧,你可能會喜歡嘗試:

#include <stdio.h> 
#include <string.h> 

int main(void) { 
    char myString[100]; 
    char *hello = "hello world\n"; 
    int ii; 
    for(ii=strlen(hello); ii>=0; ii--) ungetc(hello[ii], stdin); 
    fgets(myString, 99, stdin); 
    printf("I just read '%s'\n", myString); 
    return 0; 
} 

當我編譯和運行,我得到:

I just read 'hello world 
' 

注意,newline保持與字符串(這是必要的fgets立即返回) - 所以你需要分開照顧。我不需要單獨打回車 - 只需運行程序即可。

我確信您可以根據您的需求進行調整。

+0

值得一提的是,可能成功調用'ungetc()'的次數是有限的:http://pubs.opengroup.org/onlinepubs/9699919799/functions/ungetc.html – alk

+0

@alk - 這是提到,併爲鏈接。不清楚限制是什麼 - 我想你需要查看返回值以確認每個字節的成功或失敗。這確實讓這個解決方案非常脆弱...... – Floris

+0

這個限制有點混亂。上面鏈接的'ungetc()'頁面明確指出_應提供一個字節的推回,但函數的描述否則以複數形式描述推回。 (另外,當我得知這個函數時,我知道它有一個明確的一個字節限制。) –

0

我有一個答案,但它不涉及標準緩衝區。在我編寫的一些程序中,我有可選的命令行參數。您可以添加一個命令行標誌並在命令行中包含可選輸入或作爲輸入文本文件。如果這個選項適合你,我可以擴展這個答案。

+0

我想到了這一點,但我想看看是否有一種更「巧妙」的方式來做到這一點,可以這麼說。 –