2013-10-12 70 views
1

我現在在大學學習C語言。我想從用戶那裏獲得輸入,然後在屏幕上打印出來。我嘗試了scanf和fgets,它們都崩潰了。請幫助我需要了解如何獲取輸入並打印出來。問題與用戶輸入

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

int main() 
{ 
    char name[256]; 
    printf("Write something:\n"); 
    gets(name); 
    printf("You wrote: %s", name) ; 
    return 0; 
} 
+2

上面的代碼[韓元」 t崩潰](http://ideone.com/EVHS3S),除非有緩衝區溢出,請避免使用'gets' – P0W

+0

因爲它唯一不會崩潰的....抱歉!我真的在幾個小時內搜索了stackoverflow,我沒有發現類似的問題。 – valkon

回答

3
gets

是危險的和棄用:

由於用戶不能指定傳遞給 緩衝區的長度得到(),該函數的使用是不鼓勵。字符串 的長度爲無限制。有可能以這種方式溢出緩衝區,導致應用程序失敗或可能的系統安全 違規。

使用fgets代替:

fgets(name, 256, stdin); 

fgets(name, sizeof(name), stdin); 

,它不會崩潰(即使你鍵入超過255個字符)

+0

謝謝你這麼多! – valkon

+0

歡迎您:) –

1

千萬不要使用gets。它不提供針對緩衝區溢出漏洞的保護措施(也就是說,您不能告訴它傳遞給它的緩衝區有多大,因此它不能阻止用戶輸入大於緩衝區和破壞內存的行)。
gets()不允許您指定要存儲字符串的緩衝區的長度。這將允許人們在緩衝區末尾輸入數據。
fgets將永遠讀取新行,如果緩衝區足夠大,以容納它(它可以讓你知道什麼時候緩衝區太小,有更多的線路等待讀取)。

+0

那麼根據你'printf'是否可能導致崩潰? – P0W

+0

@ P0W;沒有。當然,這是緩衝流。 – haccks