2013-04-27 111 views
0

我想編寫一些從用戶(使用控制檯)獲取字符串的小程序,當最大輸入爲100個字符時,以及當用戶按下輸入時 - 它會將輸入複製到某個文件。 我想退出循環時,用戶輸入字符串「退出」如何循環用戶輸入並將其複製到文件,直到使用C輸入「退出」字符串?

例如: 「嗨,你好嗎?」 「bla bla」 「exit」 我只是不知道如何使它工作 - 我應該使用scanf嗎? getchar函數?與fgets?

char* buf ; 
int i; 


buf = (char*)calloc(100, sizeof(char)); 
while(1) 
    { 
    fgets(s, sizeof(s), stdin); 
    if (strcmp(s , "exit") == 0) 
     break; 
    else 
    ...write to file... 
    } 

我需要手動放置「\ 0」嗎?

謝謝!

回答

2

fgets()很好,但在某些實現中,它將尾隨的換行符(\n)放在行尾。你必須爲了去除它的比較工作,或準備比較同時接受"exit""exit\n"

if (strcmp(s , "exit") == 0 || strcmp(s , "exit\n") == 0) 
    break; 

fgets(s, sizeof(s), stdin); 
char *p = strchr(s, '\n'); 
if (p) *p = 0; 

if (strcmp(s , "exit") == 0) 
    break; 

旁註:除非你打算將字符串返回給調用者功能,根本不需要使用calloc()。使用自動數組來代替:

char s[0x100]; // or whatever 
+0

謝謝!另一件事,我不太確定 - 如果我有一個數組,我想把這個字符串放在那裏 - 我現在應該拋出每封信並複製它:arr [i] = s [i]?直到我到'\ 0'? – user1386966 2013-04-27 16:07:13

+0

@ user1386966是的,但不要手動執行此操作。 'strncpy(dest,buf,destsize);',但是請閱讀'strncpy()'的手冊頁,因爲如果你不檢查它的返回值是不安全的。 – 2013-04-27 16:08:35

+1

「某些實現」是符合實現的超集,「在換行符(**被保留**)之後不會讀取其他字符」。如果有空格(根據size參數),'fgets'必須將新行存儲在緩衝區中。 – 2013-04-27 16:17:02

2

我應該用scanf函數? getchar函數?與fgets?

以上任何一項,但您的while循環都應轉換爲:輸入被讀取且輸入不是「退出」時。你的while循環現在轉化爲:雖然世界沒有結束。

我建議是這樣的:

while (fgets(s, sizeof s, stdin) == s && strcmp(s, "exit\n") != 0) { 
    /* ... */ 
} 

我是否需要手動將 「\ 0」?

否;通過仔細選擇工具,您可以使用標準I/O庫生成的字符串(上述代碼爲fgets/strcmp)使用標準字符串庫或通過其他更復雜的方式處理非字符串。


PS。有沒有必要投malloc,並sizeof (char)總是之一C.

+0

謝謝!它幫助很多 – user1386966 2013-04-27 16:08:14

1

對於你的問題,fgets()自動附加一個\0

C++ Reference

A terminating null character is automatically appended after the characters copied to str.

請注意,fgets()停在輸入的新聞閱讀並附加\n過,但是,從你的問題,我推測,這可能有利於你。

對於fgets()scanf()之間的差異,可以找到一個很好的討論here.

+0

@ user1386966請不要在每個答案下留下相同的評論。它被認爲是亂拋垃圾。 – 2013-04-27 16:09:22

+0

我知道@ H2CO3已經回答了你的問題。如果討論集中在一個領域,這將是一件好事。提高未來訪問此主題的人員的可讀性。 – 2013-04-27 16:10:23

+0

對不起 - 我刪除它。 – user1386966 2013-04-27 16:10:24

相關問題