2017-07-17 45 views
-2

以下代碼時:發生當比較C中的字符串時,fgets比scanf更有效嗎?

#define MAX_NAME_LENGHT 256 
int main(void) 
{ 
    char name[MAX_NAME_LENGHT]; 
    printf("Enter your name: \n"); 
    scanf("%s", name); 
    if(strncmp(name, "John Smith", 10) == 0) 
    { 
     printf("Hello, John Smith!\n"); 
    } 
    else 
    { 
     printf("Intruder!!!\n"); 
    } 
    return 0; 
} 

許多錯誤,儘管輸入查詢John Smith輸出打印Intruder!!!。然而,當我更換

scanf("%s", name); 

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

輸出打印Hello, John Smith!這是爲什麼?

+4

對於''%s「'格式的'scanf'來說,讀取*空格分隔的單詞*是一件好事。 –

+1

您是否嘗試過在strncmp之前打印名稱以檢查在那裏保存了什麼? – CIsForCookies

+1

這裏沒有理由使用'strncmp'。使用'strcmp',因此您不必在匹配中計數字符。並且*總是*檢查'scanf'的返回值(並且就此而言,'fgets')。 – rici

回答

1

請嘗試使用下面的代碼行,因此scanf會一直保留值,直到遇到'\n'(換行符),因此空間也會被保存。

scanf("%[^\n]", name); 

記住scanf代表「掃描格式化」,並有珍貴的一點少比格式化用戶輸入的數據。如果您完全控制輸入數據格式,但通常不適合用戶輸入,則這是理想選擇。

+1

我只想求佛以'%使用scanf'的' s'可能導致'name'的緩衝區溢出用戶輸入大量數據,因爲'name'是堆棧中的一個變量。有關更多解釋,請參見[這裏](https://stackoverflow.com/a/2430310/8051589)。所以使用'fgets'應該是最好的選擇。 –

+0

我認爲'fgets'和'scanf'返回不同的字符串(一個包含回車符,但我忘記了哪個) –

+0

''''[\ n] s'無效。應該是'%[^ \ n]' –