C言語のchar型ポインタに1文字ずつ文字列を代入すると語尾が0のときprintfの結果がおかしい

2022年10月22日

問題発生状況

  • char*型の変数にmalloc関数でメモリを割り当て、char型の値を一つずつ代入していくプログラムを作成
  • 語尾の値が「0」のとき、printf関数で文字列を出力すると、最後に「�」がつく
    • 下記の関数での例
      • max_input=4multi_inbyte0000を代入した場合の出力は「0000�
      • 確認した範囲では語尾が「0」以外の時は最後に「�」はつかない
  • 該当の関数
char* multichar_input(int max_input)
{
    char inbyte_in;
    char* multi_inbyte;
    multi_inbyte = (char*)malloc(max_input * sizeof(char));
    for(int i=0; i<max_input; i++)
    {
        inbyte_in = inbyte();
        multi_inbyte[i] = inbyte_in;
    }
    xil_printf("\n\r", multi_inbyte);

    return multi_inbyte;
}

解決策

  • 文字列をnull終端させる
    • 一文字多くメモリを割り当て、最終文字に'\0'を代入する
    • 注意:最終文字に'\0'ではなく"\0"を代入すると語尾が0以外でも「�」がつくようになった
  • 修正後の関数は下記
char* multichar_input(int max_input)
{
    char inbyte_in;
    char* multi_inbyte;
    multi_inbyte = (char*)malloc((max_input+1) * sizeof(char));  // 変更:max_input -> (max_input+1)
    for(int i=0; i<max_input; i++)
    {
        inbyte_in = inbyte();
        multi_inbyte[i] = inbyte_in;
    }
    multi_inbyte[max_input] = '\0';                            // 追記
    xil_printf("\n\r", multi_inbyte);

    return multi_inbyte;
}

参考サイト

C言語

Posted by ttnt