電脳ミツバチのコンピュータ広報室

銀座の屋上菜園を耕しています。コンピュータ畑も耕します。

①メンバに文字列をコピー

スポンサーリンク

メンバに文字列をコピーする。なお上で作成したヘッダファイルkouzoutai.hを使う。

#include<stdio.h>
#include<string.h>
#include "kouzoutai.h"

int main(void){
	struct p_kouzoutai copy;
	strcpy(copy.a,"testcopy");	
	printf("%s\n",copy.a);
}
	
結果
異常終了
<||
結果うまくいかない。
今度は配列のほうでやってみる。
>||
#include<stdio.h>
#include<string.h>
#include "kouzoutai.h"

int main(void){
	ARRAY copy;
	strcpy(copy.a,"testcopy");	
	printf("%s\n",copy.a);
}

結果
testcopy

ついでにせっかく宣言したtypedefの方を使った。
それはともかくうまくいった。
文字列操作の項と上で散々やったように配列は配列で取った分の領域を確保しているのに対してポインタはアドレスである。
ポインタのときはわざとtypedefの型を使わなかったのはp_kouzoutaiをローカル変数で宣言しているということを伝えたかった。ローカル変数は初期化しない限り値は不定。そのアドレスに文字列をコピーしていたので結果異常終了を起こした。
ではポインタは使えないかというともちろんそんなことはない。
この場合strdup関数を使う。(まだANSII Cでは標準関数として認められていないが一般的に使われている。)strdup関数は引数に与えられた文字列のコピーをmallocした領域に作成し、そのアドレスを返す。

#include<stdio.h>
#include<string.h>
#include "kouzoutai.h"

int main(void){
	POINT copy;
	copy.a=strdup("testcopy");	
	printf("%s\n",copy.a);
}
結果
testcopy

なるたけ同じコードを流用する。
今度はうまく言った。
strdupの仕様はchar *strdup(const char *s);でmallocもししてくれているので非常に使い勝手がいい。
strdupに別のメンバ名を入れることもよく行われる
exp; copy.a=strdup(copy.b)

ついでにstrdupの中身を記述すると

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *strdup(const char *src)
{
	char *p;
	if(src==NULL)
		return NULL;
	
	p=malloc(strlen(src)+1);
	if(p)	{strcpy(p,src);}
	return p;
}
	

こんな感じである。