【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は書かなくてよい");
    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は間違いです。


参考:

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