2010-01-27 23 views
0

我現在正在學習C,並且直接從我正在使用的書中複製了這個小片段。它運行時出現段錯誤,我無法弄清楚爲什麼,我通過gdb運行它,並在第9行scanf(「%s」,aName)處停止;但是打印這些變量的值不會帶來可疑的外觀。這件事有什麼問題?C - 調用scanf()時的程序段錯誤

#include <stdio.h> 

int nameLength(char[]); 

main() { 
    char aName[20] = {'\0'}; 

    printf("\nEnter your first name: "); 
    scanf('%s', aName); 
    printf("\nYour first name contains %d letters.", nameLength(aName)); 
} 

int nameLength(char name[]) { 
    int result = 0; 
    while (name[result] != '\0') { 
    result++; 
    } 
    return result; 
} 

編輯:我忘了提及,它甚至沒有顯示提示或讓我輸入名稱。它在執行後立即崩潰。

+0

如何使用標準strlen函數而不是nameLenght?你輸入的名字有多長? – 2010-01-27 14:33:00

+0

你得到了你的答案,但考慮使用其他書。在這種情況下'scanf'不是一個安全的函數,並且具有上述代碼的書不能很好。 – 2010-01-27 14:58:53

+0

使用fgets比使用scanf更安全。你也應該檢查你的返回代碼,看看scanf是否成功返回。 – ant2009 2010-01-27 15:51:31

回答

9

在該列表中,你有'%s',而不是"%s" - 注意單引號和雙引號之間的差異。單引號分隔字符,雙引號分隔字符串。 scanf()需要一個字符串的第一個參數,所以你需要雙引號。在scanf

+3

你應該在你正在使用的任何編譯器中打開完整的警告(例如-Wall for gcc)。它會以啓蒙的形式給你帶來很多。那可能會發現這個錯誤,並且可能已經告訴了你到底發生了什麼錯誤。 – 2010-01-27 15:21:58

4
scanf('%s', aName); 

使用雙引號:

scanf("%s", aName); 

還是可以肯定的:

scanf("%19s", aName); 

要限制字符串19個字符

3

嘗試用這種替代scanf函數行:

scanf ("%s", aName); 

注意雙引號。

...任賢齊

1

如果這是一個練習來算的字母數,那麼你可以做到以下幾點,但使用指針。

int nameLength(char *name) 
{ 
    int i = 0; 
    while(*name++) { 
     i++; 
    } 
    return i; 
}