2017-09-26 116 views
4

printf()函數使用格式說明%s打印char *。 該標準沒有指定如何將char實現爲有符號或無符號。打印數據類型char()

因此,作爲簽訂charchar實現,我們用%s打印unsigned char *,是安全的做到這一點?

在這種情況下我們應該使用哪種格式說明符?

+0

指針沒有標誌,並且指針目標沒有在算術上處理,所以沒關係。 –

+0

@MartinJames不清楚[評論](https://stackoverflow.com/questions/46426473/printing-data-type-char-with-printf/46427667#comment79809984_46426473)如何適用於這裏。也許它反映了​​問題的早期版本? – chux

回答

6

...當charsigned char實現,我們用"%s"打印unsigned char*。這樣做安全嗎?

是的,它是安全的。

char *cp = ...; 
signed char *scp = ...; 
unsigned char *ucp = ...; 
printf("%s", cp); // OK. 
printf("%s", scp); // OK. 
printf("%s", ucp); // OK. 

(%S)...參數應是指向字符類型的數組的初始元素。 ... C11dr§7.21.6.18

三類charsigned charunsigned char統稱爲字符類型。 C11§6.2.515

+0

謝謝!我已閱讀標準,並查看%的需要字符類型,但我還沒有得到類型是什麼性格。我應該更仔細地閱讀標準。 – user8174916

-1

如果你試試這個:

#include<stdio.h> 

void main() 
{ 
char name[]="siva"; 
printf("name = %p\n", name); 
printf("&name[0] = %p\n", &name[0]); 
printf("name printed as %%s is %s\n",name); 
printf("*name = %c\n",*name); 
printf("name[0] = %c\n", name[0]); 
} 

輸出是:

name = 0xbff5391b 
&name[0] = 0xbff5391b 
name printed as %s is siva 
*name = s 
name[0] = s 

所以 '名字' 實際上是一個指向字符在內存中的數組。