サイトマップ / C言語講座出入り口総目次目次:ポインタ>文字列をコピー

青い直線

文字列をコピー

青い直線

[ポインタと配列]←このソース→[コーディングスタイル]

/* 今日はポインタを使って、文字列をコピーする関数、StringCopy( )を作ります。

StringCopy( )は2つのchar型のポインタ、s1とs2を引数として取ります。2つ目の引数の指すデータは書き換えないので、constを付けます。

s2の指しているデータを、s1にコピーします。s1の指すメモリブロックの大きさがs2のそれよりも小さいと、他のデータに上書きをしてしまう可能性があります。その結果、何が起こるか予測がつきません。動作が異常になるか、最悪の場合システムがクラッシュして暴走します。

s1もs2も、最初は文字列の先頭の要素を指しています。Cでは文字列はヌル文字 ('\0')で終わります。従って、次に示すアルゴリズムを実現すれば良いわけです。

  1. s2の指している要素の内容がヌル文字でなければ、
  2. s2の指している要素の内容を、s1にコピーして、
  3. s1とs2をインクリメントする。
  4. 最初に戻る。

これを素直にコードにしたのが下記の関数です。

    void StringCopy( char *s1, const char *s2 )
    {
        while (*s2 != '\0')
        *s1++ = *s2++;
    }

しかし、これでは冗長だというのなら、'*s2'の位置に'*s1++ = *s2++'を代入するとよりコンパクトになります。今回のソースプログラムはそちらの版です。 */

/* ここからソースプログラム */

#include <stdio.h>

void  StringCopy2(char *s1, const char *s2);
void main(void);

  /* 文字列 s1 に s2 をコピーする */
void  StringCopy2(char *s1, const char *s2)
{
      /* s2 の指す中身がヌルでなければ一文字コピー */
    while ((*s1++ = *s2++) != '\0')
        ;                           /* 空白行¥ */
}

void main(void)
{
    char s1[40]  = "UPPER CASE";
    char s2[40] = "lower case";

    printf("コピー前: s1 = %s\n", s1);
    printf("コピー前: s2 = %s\n", s2);
    StringCopy2(s1, s2);
    printf("コピー後: s1 = %s\n", s1);
}

/* ここまでソースプログラム */

/*

活字を使って印刷していた時代に、大文字の活字は上側の箱(case)に、小文字は下側の箱に入っていました。

今回の関数と同等のものが標準ライブラリ関数にあります。特別な事情がなければこちらを使って下さい。

    #include <string.h>
    char *strcpy(char *s, const char *t);

    例:strcpy(s, t);

    戻り値    s の値

*/

[ポインタと配列]←このソース→[コーディングスタイル]

青い直線

/* (C) 2000- YFプロ. All Rights Reserved. */    提供:C言語講座−それ自体コンパイルできる教材を使った講座です−

青い直線

サイトマップ / C言語講座出入り口総目次目次:ポインタ>文字列をコピー