2014-06-04 45 views
0

我正在爲C字符數組的元素類型掙扎。字符數組元素類型的混淆

char get_final (char *num_str) 
{ 
    int len = strlen(num_str); 
    char val; 
    val = num_str[len-1]; 
    printf("the number is %s\n", num_str); 
    printf("the length is %d\n", len); 
    printf("the last digit is %s\n", val); 
    printf("the last digit is %s\n", num_str[len-1]); 
    return val; 
} 


int main() { 
    char num[4] = "123"; 
    int last; 
    last = get_final(num); 
    printf("final: the last digit is %d\n", last); 
} 

當我編譯,我得到關於該格式%s需要一個字符該函數的最後一個數字的打印警告,但我給它一個int。但是我已經將變量val聲明爲char,並且我將它從一個字符數組中分配給一個元素。那麼爲什麼整數類型的投訴?

當我運行代碼時,它在這個同一點上發生段錯誤。

我該如何解決這個問題?

+1

當錯誤消息顯示「一個int」時,它指的是您傳入的「char」。它表示「int」的原因是由於*默認參數促銷*。 –

+2

此外,有關%s的警告消息會說它期望'char *',而不是「一個字符」。 C: –

回答

4

更換

printf("the last digit is %s\n", val); 
printf("the last digit is %s\n", num_str[len-1]); 

printf("the last digit is %c\n", val); 
printf("the last digit is %c\n", num_str[len-1]); 

通過將%sprintf,你說你想打印一個字符串(字符0終結陣列由char *指出) ,而不是一個角色。但是valnum_str[len-1]都是字符,所以您應該使用%c代替。

3

%s需要以空字符結尾的字符串。 val是一個字符,因此是單個字符而不是空值終止。

printf將把val解釋爲指向空終止字符串的指針,但由於val可能不是有效的指針,因此您會得到未定義的行爲並可能導致崩潰。

+2

Nit:'%s'需要一個'char *',它指向以0結尾的字符串的開頭。 –

0

轉換說明符的%s期望其相應參數的類型爲char *,並且參數指向以0結尾的字符串的開頭。

valnum_str[len-1]都有類型char。由於printf正在將您通過的字符值解釋爲地址,因此您將收到段錯誤。它不是打印1,而是尋找從地址0x00000031開始的字符串,該字符串不是有效或可讀的地址,因此是段錯誤。

要打印出單個字符值,請使用%c轉換說明符。