【C言語】
文字列末尾の終端文字¥0は
自分で書かなくてOK

文字列の終わりに 終端文字¥0

warning: embedded ‘\0’ in format

警告:書式中に終端文字¥0があると書式終了
[-Wformat-contains-nul]


■末尾の¥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を書く人は少なくありません。


■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は間違いです。


参考:

STR32-C. 文字列を引数にとるライブラリ関数に null 終端されていない文字配列を渡さない