的printf()
函數使用格式說明%s
打印char *
。 該標準沒有指定如何將char
實現爲有符號或無符號。打印數據類型char()
因此,作爲簽訂char
時char
實現,我們用%s
打印unsigned char *
,是安全的做到這一點?
在這種情況下我們應該使用哪種格式說明符?
的printf()
函數使用格式說明%s
打印char *
。 該標準沒有指定如何將char
實現爲有符號或無符號。打印數據類型char()
因此,作爲簽訂char
時char
實現,我們用%s
打印unsigned char *
,是安全的做到這一點?
在這種情況下我們應該使用哪種格式說明符?
...當
char
在signed 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
三類
char
,signed char
和unsigned char
統稱爲字符類型。 C11§6.2.515
謝謝!我已閱讀標準,並查看%的需要字符類型,但我還沒有得到類型是什麼性格。我應該更仔細地閱讀標準。 – user8174916
如果你試試這個:
#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
所以 '名字' 實際上是一個指向字符在內存中的數組。
指針沒有標誌,並且指針目標沒有在算術上處理,所以沒關係。 –
@MartinJames不清楚[評論](https://stackoverflow.com/questions/46426473/printing-data-type-char-with-printf/46427667#comment79809984_46426473)如何適用於這裏。也許它反映了問題的早期版本? – chux