strcpyでハマる場合

DBのSELECT結果やユーザからの入力を叩き込む場合はstrcpyを使うとハマる場合がある。
特に文字コードがUTF-8の場合。
なぜなら、UTF-8で日本語を扱うと3バイトになるから。
つまーり、少なめに領域確保をしていた場合、strcpyを使うと楽勝でメモリリークします。
防止するにはstrncpyで確保した最大領域を指定しておくことだが面倒くさいっす。

char hoge[]="abc";
char mosa[]="abcdef";
strncpy(hoge, mosa, 3);
hoge[3]='';
printf("%sn",hoge);
実行結果
abcdef
なお、strncpy(hoge, mosa, 4);
にすると、ヌル文字が格納されないので出力は文字化けする。

上記のコードにおいて、mosaはhogeより大きいが、hogeが領域破壊を起こすことはない。
これがstrcpyだと破壊される。
strncpyで文字列をコピーする際、コピーサイズnに指定できる最大サイズは
hogeの確保領域-1と心得ること。
今回の例だと4が確保領域なので、最大3まで指定可能。
4を指定してしまうとヌル文字を代入できないので不可となる。
コピー後に配列のn番目の要素にヌル文字を代入するのも必須。
厳密には必須じゃない場合もあるが代入するクセをつけておいた方が良い。
文字列として扱わないのならばnに4を指定して、ヌル文字の代入を省略してよいが。
ケースバイケースで対応するのがよろし。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です