サイトマップ / C言語講座>出入り口>総目次>目次:ポインタ>文字列をコピー
[ポインタと配列]←このソース→[コーディングスタイル]
/* 今日はポインタを使って、文字列をコピーする関数、StringCopy( )を作ります。
StringCopy( )は2つのchar型のポインタ、s1とs2を引数として取ります。2つ目の引数の指すデータは書き換えないので、constを付けます。
s2の指しているデータを、s1にコピーします。s1の指すメモリブロックの大きさがs2のそれよりも小さいと、他のデータに上書きをしてしまう可能性があります。その結果、何が起こるか予測がつきません。動作が異常になるか、最悪の場合システムがクラッシュして暴走します。
s1もs2も、最初は文字列の先頭の要素を指しています。Cでは文字列はヌル文字 ('\0')で終わります。従って、次に示すアルゴリズムを実現すれば良いわけです。
これを素直にコードにしたのが下記の関数です。
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言語講座−それ自体コンパイルできる教材を使った講座です−