文字列を扱う(文字列コピー関数を作る)


 前章までを理解していただけているならば、後はそんなに学ぶことはないと思います。C言語の難点の一つは”文字列”=”文字列”が出来ない点だと思います。そこで、ライブラリの関数に strcpy という、文字列のコピーをする関数が有ります。ここでは、この strcpy と同じような機能の関数を作りたいと思います。「配列はポインタ、サンプルコード」で示したように、配列をインデックス番号で扱う場合と、間接演算子 "*" を使った場合のコードを示します。もう、ここまで来たら、習うより慣れろですね。ここでは、#define を用いて 0x00 を NULL と置き換えます。#define もよく使うので、使えるようにしましょう。

サンプルコード
<自作 strcpy 関数>
ソースファイル(0.9K-Byte)
------------------------------ sample6.c START ------------------------------
    #include
    
    #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アドレス