2013-07-15 63 views
0
#include<stdio.h> 
int main() 
{ 
char str[3][10]={ 
        "vipul", 
        "ss", 
        "shreya" 
}; 

爲什麼這是行不通的:2-d字符數組

printf("%s",str[1][0]); 

如果我想訪問str

printf("%s",&str[1][0]); 

或本會做它完美

printf("%s",str[1]); 

任何人都可以解釋嗎? 爲什麼第一個代碼給了一個錯誤

prog.c: In function ‘main’: 
prog.c:9:5: error: format ‘%s’ expects argument of type ‘char *’, but 
        argument 2 has type ‘int’ [- Werror=format] 
cc1: all warnings being treated as errors 

爲什麼參數的類型爲int

+4

這就和說'printf(「%s」,'a')''一樣。 http://codepad.org/0PPoS9BU –

回答

3
printf("%s",str[1][0]); 

問題在於這一行。當對於%s格式說明符時,printf()需要一個指向空終止字符串的指針。而str[1][0]是一個簡單的炭(具體地在"ss"第一s),其提升爲int(默認參數提升)。這正是錯誤信息所說的。

+0

奇怪的是,答案沒有回答爲什麼參數的類型爲'int'獲得了最多的選票。爲你+1和所有類似的答案。 – 0decimal0

+0

@VipulVerma從技術上講,這個答案應該是公認的答案。 – 0decimal0

3

str[1]char*str[1][0]char
但是當你使用%sprintf()預計指針,以便嘗試將焦炭鑄造成一個指針。

所以你char被提升到一個int

+0

@VipulVerma他沒有回答爲什麼它鍵入'int' ...仔細閱讀其他答案。 – 0decimal0

1

它是在錯誤說:

format ‘%s’ expects argument of type ‘char *’ 

和你的論點str[1][0]char,而不是預期的char *。在C中,char被視爲int

0

在第一種情況下printf("%s",str1[1][0]);您正在將單個字符傳遞給您使用它的printf函數和格式說明符%s。對於%s printf函數需要字符串而不是字符。因此它會給出錯誤。
作爲第一個printf函數要指定%s和你逝去的人物,論證推廣會發生和char將晉升爲int

•The default argument promotions are char and short to int/unsigned int and float to double 
•The optional arguments to variadic functions (like printf) are subject to the default argument promotions 

更多關於Default argument promotionhere

0
線路上的錯誤

printf("%s",str[1][0]); 

你嘗試,你有一個字符(「%C」中的printf)

所以只打印烏爾二維數組你會的一個打印字符串必須做這樣的事情:

int main() 
    { 
    int i; 
    char str[3][10]= 
    { 
    "vipul", 
    "ss", 
    "shreya" 
    }; 
    i = 0; 
    while(str[0][i] != '\0') 
    { 
    printf("%c",str[0][i]); 
    i++; 
    } 
    } 

這是非常醜陋的^^

,而不是你合作uld打印所有你的2D陣列,用3次單次迭代:

int main() 
{ 
int i; 
char str[3][10]= 
{ 
"vipul", 
"ss", 
"shreya" 
}; 
i = 0; 
while(i < 3) 
{ 
printf("%s\n",str[i]); 
i++; 
} 
}