strncpyのおかしな挙動

C言語のstring.hにはstrncpy関数が定義されていますが、この関数を用いるときは注意しなければならない点があります。それは、コピー先には終端記号「\0」が自動的につかないこと。第3引数で指定した範囲しかコピーしないので、自分自身で終端記号を付ける必要があります。

たとえば、こんなコードがあったとしましょう。

char* str = (char*)malloc(sizeof(char)*100);
strncpy(str,"abcde",3);

すると、変数strが指す記憶領域には次のように記録されます。

str → | a | b | c | x | …| \0 | …|

上で書かれているxはランダムな文字(値)です。そのため、運よくxに終端記号が入る場合もありますが、別の値が入る場合もあります。そうなった場合はその文字(値)自身も文字列の一部として認識されてしまいます。このような場合を防ぐには、自分自身で終端記号を代入するのが一番確実です。

*(str+3) = '\0';

上のコードではマジックナンバーで指定してありますが、実際は変数か定数で指定したほうがよいでしょう。

トラックバック(0)

このブログ記事を参照しているブログ一覧: strncpyのおかしな挙動

このブログ記事に対するトラックバックURL: http://trialpc.net/mt/mt-tb.cgi/1031

コメント(2)

hszaki :

strncpyの挙動は,ぜんぜんおかしくないです.'\0'入れない方が,汎用性高いんですよ.
例えば,
str = "aaabbbccc";
の,bbbの部分をBBBに変えたい時,'\0'が入らないなら,
strncpy(str+3, "BBB", 3);
とできるけど,'\0'が入ってしまう仕様では,strncpyを使用できない.



tetsu Author Profile Page:

確かにその通りなんですけどね~。
こういうところをちょっと忘れてしまうと、かなり致命的なバグになり得るんで、もうちょっとなんとかならないかな?とは思いますね。

そんな訳で、個人的にはsprintfの方をよく使ったりしますね。hszakiさんが示した例ではもちろんstrncpyを使うと思いますけどね。


コメントする

Advertizement

このブログ記事について

このページは、tetsuが2007年1月26日 02:02に書いたブログ記事です。

ひとつ前のブログ記事は「虫取り Actionscript編」です。

次のブログ記事は「展開するだけでインストールできるソフトウェアでの注意点」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 5.0

最近のコメント

tetsu on strncpyのおかしな挙動: 確かにその通りなんで
hszaki on strncpyのおかしな挙動: strncpyの挙動

カウンタ

リンク