C言語関係掲示板

過去ログ

No.87.文字列のコピー


mallocを使った動的領域割り当てを行った値だけファイルに書き出しを行いたいのですが、うまくいきません。教えてください。mallocで定義する数値やデータは親PGから引数として渡すため最終的には動的にしたい。
s = (char *)malloc(12) ;
strcpy(s,"1234567890123456");
if(( fputs(s,fpin )) != NULL ){
free(s) ;
break;
}
とした場合12バイトの領域を確保しているわけだから、12バイト分だけ
ファイルに書込みを行いたいのですが、16バイト分書き出されてしまいます。
mallocした領域について、上記のような使用はできないのですか?
または別のやり方がありますか、教えてください。


yutakaさん、こんにちは。

> s = (char *)malloc(12) ;
> strcpy(s,"1234567890123456");
> if(( fputs(s,fpin )) != NULL ){
> free(s) ;
> break;
> }
>とした場合12バイトの領域を確保しているわけだから、12バイト分だけ
>ファイルに書込みを行いたいのですが、16バイト分書き出されてしまいます。
>mallocした領域について、上記のような使用はできないのですか?

12バイト分mallocしたエリアに17バイト('\0'を含む)の文字列
をstrcpyすると、エリアを破壊してしまいます。strcpy関数は
引数で指定されたアドレスにそのまま文字列をコピーするので、
エリアの大きさのチェックは行いません。
エリアの大きさを指定するのは、strncpy関数を使います。

また、fputs関数も引数で指定されたアドレスから文字列を'\0'まで
ファイルに書き込むだけですので、エリアの大きさはチェックしません。
大きさを指定するのなら、fwriteを使えばいいのですが、

 size_t fwrite(const void *buf, size_t size, size_t n, FILE *fp);
 bufの先頭から「sizeバイト×n個」分のデータをファイルfpに書き込む。

これですと、
文字列サイズ > 指定バイト数 の場合、文字列終了の'\0'は書き込まれません。


STRNCPY関数を使ったらうまくいきました。
ありがとうございます。

戻る


「初心者のためのポイント学習C言語」 Last modified:2002.01.11
Copyright(c) 2000-2002 TOMOJI All Rights Reserved