C言語の課題でハマったので備忘録
TL; DR
printf関数にnull文字を含む文字列を与えると、その文字列はnull文字以降の文字を表示しなくなるよ。 例) {0x41, 0x00, 0x42}をprintf関数に与えると、A(0x41)だけ出力される。2つ目以降は表示しない。環境
OS windows 10コンパイラ MinGW 5.4
CLI PowerShell
本題
詳しく見ていきましょう。問題が起こったコードはこちらです。誤って文字列の範囲外の要素を指定して、代入してしまいました。#include <stdio.h>
int main(void){
char str[4] = "xyz";
str[0] = str[5];
printf("str: %s", str);
return 0;
}
// 出力
// str:
文字列が消えた…?!
本当に文字列が消えたのでしょうか?strのそれぞれのASCIIコードを確認しましょう。
#include <stdio.h>
int main(void){
char str[4] = "xyz";
str[0] = str[5];
printf("str[0]: %c, str[1]: %c, str[2]: %c", str[1], str[2], str[3]);
return 0;
}
// 出力
str[0]: 0, str[1]: 0x79, str[2]: 0x7A
最初の文字が置き換わっただけで、ほかは初期値のままですね(0x79: y, 0x7A: z)。これだけでは、null文字があるとすべての文字が出力できないのか、それ以降が出力できないのか切り分けができません。別のindexで試してみましょう。
#include <stdio.h>
int main(void){
char str[4] = "xyz";
str[1] = str[5];
printf("str: %s\n", str);
printf("str[0]: %c, str[1]: %c, str[2]: %c", str[1], str[2], str[3]);
return 0;
}
// 出力
str: x
str[0]: 0x78, str[1]: 0, str[2]: 0x7A
null文字以降の部分が表示できないようですね。