警告:書式中に終端文字¥0があると書式終了
[-Wformat-contains-nul]
■1.末尾の¥0は自分で書かなくてOK
#include <stdio.h>
int main(void){
char buf[1024] ;
sprintf(buf,"文字列末尾の¥0は自分で書かなくて良い\0");
puts(buf);
printf("コンパイラが¥0を追加してくれる 3+1=%zu\n",sizeof("abc"));
}
文字列リテラルの終端文字¥0は
コンパイラが入れてくれるので
プログラマがわざわざ自分で記載する必要はありません。
sizeof(“abc”)は見かけ上3文字ですが
コンパイラが¥0を入れてくれるので結果は
3+1=4となります。
printf()の文字列末尾に¥0を書く人を見たこと無いですが
なぜか
sprintfの文字列末尾の¥0を書く人は少なくありません。
■2.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は間違いです。