前章までを理解していただけているならば、後はそんなに学ぶことはないと思います。C言語の難点の一つは”文字列”=”文字列”が出来ない点だと思います。そこで、ライブラリの関数に strcpy という、文字列のコピーをする関数が有ります。ここでは、この strcpy と同じような機能の関数を作りたいと思います。「配列はポインタ、サンプルコード」で示したように、配列をインデックス番号で扱う場合と、間接演算子 "*" を使った場合のコードを示します。もう、ここまで来たら、習うより慣れろですね。ここでは、#define を用いて 0x00 を NULL と置き換えます。#define もよく使うので、使えるようにしましょう。
#define NULL (0x00)
/* インデックス番号を使った場合 */
void myStrcpy1( char* to, char* from )
{
long index;
index = 0;
while( from[index] != NULL ){
to[index] = from[index];
index++; /* インデックスのインクリメント */
}
/* NULL を最後につける */
to[index] = NULL;
}
/* 間接演算子を使った場合 */
void myStrcpy2( char* to, char* from )
{
while( *from != NULL ){
*to = *from;
to++; /* アドレスのインクリメント */
from++; /* アドレスのインクリメント */
}
/* NULL を最後につける */
*to = NULL;
}
main()
{
char buf1[100];
char buf2[100];
/* 文字列の初期化 */
buf1[0] = NULL;
buf2[0] = NULL;
/* 文字列のコピーの呼び出し1 */
myStrcpy1( buf1, "myStrcpy1" );
myStrcpy2( buf2, "myStrcpy2" );
/* 文字列の出力 */
printf( "buf1 = %s\n", buf1 );
printf( "buf2 = %s\n", buf2 );
/* おしまい(^m^) */
return 1;
}
------------------------------ sample6.c END ------------------------------
んー、コメントすること無いですね・・・。分かりますよね? buf1[0] = NULL; としているのは文字列の終わりは NULL だから、この一文で buf1 は "" となるわけです。それでは、ついでに文字列を文字列をくっつける strcat と同じ働きをする関数も上と同じように作りたいと思います。
サンプルコード
<自作 strcat 関数>
ソースファイル(1.5K-Byte)
------------------------------ sample7.c START ------------------------------
#include
#define NULL (0x00)
/* インデックス番号を使った場合 */
void myStrcat1( char* to, char* from )
{
long index1, index2;
index1 = 0;
index2 = 0;
/* コピー先の文字列の終端(NULL位置)を探す */
while( to[index1] != NULL ){
index1++; /* インデックスのインクリメント */
}
/* 文字をコピーする */
while( from[index2] != NULL ){
to[index1] = from[index2];
index1++; /* インデックスのインクリメント */
index2++; /* インデックスのインクリメント */
}
/* 最後に NULL をつける */
to[index1] = NULL;
}
/* 間接演算子を使った場合 */
void myStrcat2( char* to, char* from )
{
/* コピー先の文字列の終端(NULL位置)を探す */
while( *to != NULL ){
to++; /* アドレスのインクリメント */
}
/* 文字をコピーする */
while( *from != NULL ){
*to = *from;
to++; /* アドレスのインクリメント */
from++; /* アドレスのインクリメント */
}
/* 最後に NULL をつける */
*to = NULL;
}
main()
{
char buf1[100];
char buf2[100];
/* 文字列の初期化 */
buf1[0] = NULL;
buf2[0] = NULL;
/* コピーの一回目 */
myStrcat1( buf1, "buf1 = " );
myStrcat2( buf2, "buf2 = " );
/* 一回目の画面出力 */
printf( "%s\n", buf1 );
prinft( "%s\n", buf2 );
/* 一回目のコピーに付け足す */
myStrcat1( buf1, "myStrcat1" );
myStrcat2( buf2, "myStrcat2" );
/* 二回目の出力 */
printf( "%s\n", buf1 );
prinft( "%s\n", buf2 );
/* おまけ */
myStrcat2( buf1, buf2 );
printf( "おまけ %s\n", buf1 );
/* おしまい(^m^) */
return 1;
}
------------------------------ sample7.c END ------------------------------
コメントの書きようが無いのがいかんともしがたい所ですが、初めにも書いたようにこの辺になると慣れが大切だと思います。コメント少なくてすみません 。(^m^;
構造体を使う(連続な空間)
C言語講座トップページ
TOP-PAGE
Web-Page制作者e-mailアドレス