警告:\0があったらそこで書式終了ですよ
[-Wformat-contains-nul]
■文字列終端の¥0は自分で書かなくてOK
#include <stdio.h>
int main(void){
char buf[1024];
sprintf(buf,"文字列終端\0 ←\0は書かなくてよい");
printf(":%s:\n",buf);
sprintf(buf,"文字列終端\0");//←\0は書かなくてよい
printf(":%s:\n",buf);
printf(":%s:\n","文字列終端\0");//←\0は書かなくてよい
}
文字列終端の¥0は
コンパイラが入れてくれるので
自分で記載する必要はありません。
printf()の文字列終端に
¥0を書く人を見たこと無いですが
なぜか
sprintfの文字列終端に
¥0を書く人は少なくありません。
➡実行結果
./a.out
:文字列終端:
:文字列終端:
:文字列終端:
■sizeof(“abc”)=4
#include <stdio.h>
int main(void){
//sizeof("abc")➡
//"abc"➡
//'a','b','c','\0'➡
//4
printf("%zu\n",sizeof("abc"));
}
sizeof(“abc”)は見かけ上3文字ですが
コンパイラが¥0を入れてくれるので
3+1で結果は4となります。
■16進文字定数表記の書き間違い
#include <stdio.h>
int main(void){
//〇16進文字定数表記⇒アスキーコード
//"abc\n"と表示
printf("\x61\x62\x63\x0A");
//✖16進文字定数表記の書き間違い⇒いきなり終端文字¥0となる
//何も表示しない
printf("\0x61\0x62\0x63\0x0A");
}
書式の途中に終端文字¥0があると
そこで書式は終了してしまいます。
16進文字定数は
〇 ¥xhh が正解で
✖ ¥0xhhは間違いです。
参考: