0
0

More than 1 year has passed since last update.

C言語のprintf関数とnull文字を含む文字列

Posted at

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文字以降の部分が表示できないようですね。

まとめ

null文字を含む文字列をprintf関数に渡すと、null文字以降が表示されないということがわかりました。そもそも範囲外を指定するのがおかしなことですが、トラブルシューティングの助けになると幸いです。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0