C言語のchar型ポインタに1文字ずつ文字列を代入すると語尾が0のときprintfの結果がおかしい
2022年10月22日
問題発生状況
char*
型の変数にmalloc
関数でメモリを割り当て、char
型の値を一つずつ代入していくプログラムを作成- 語尾の値が「0」のとき、
printf
関数で文字列を出力すると、最後に「�」がつく- 下記の関数での例
max_input=4
、multi_inbyte
に0000
を代入した場合の出力は「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;
}
参考サイト
ディスカッション
コメント一覧
まだ、コメントがありません