サイトマップ / C言語講座>出入り口>総目次>目次:ポインタ>コーディングスタイル
/* あるプログラムを作ると、誰でも同じソースプログラムが出来上がるかというと、そうはなりません。
前回、StringCopy( )という関数を作りました。最初に考えたソースプログラムを案1に示します。
案1 void StringCopy(char *s1, const char *s2) { while (*s2 != '\0') *s1 ++ = *s2++; }
StringCopy( )は以下のように書き換えることができます。案2は配列添字版 StringCopy( )とでも言えるもので、添字を使ってデータにアクセスします。
案2 void StringCopy(char s1[ ], const char s2[ ]) { int i = 0; while ((s1[i] = s2[i]) != '\0') i++; }
重要:'!='演算子の優先順位は'='よりも高いので、カッコが必要。
案3から5はポインタ版です。数字が増えるにつれて表現が簡潔になっています。
案3 void StringCopy(char *s1, const char *s2) { while ((*s1 = *s2) != '\0') { s1 ++; s2++; } }
案4では、s2の値をs1へ代入してから、ポインタをインクリメントします。
案4 void StringCopy(char *s1, const char *s2) { while ((*s1++ = *s2++) != '\0') ; }
案5には、!= '\0'がありませんが、s2 が'\0'を指すと、while ( )のカッコ内が偽となりループから抜けます。
案5 void StringCopy(char *s1, const char *s2) { while (*s1++ = *s2++) ; }
案4または案5のスタイルで、コーディングすることを勧めます。可読性も良いと思います。
今日はStringCopy( )を使って、2つの文字列の中身を交換する関数を作ります。交換するには作業用の配列が必要です。
これを素直にコードにしたのが、ソースプログラムの XchangString( )です。 */
#include <stdio.h> void StringCopy(char *s1, const char *s2); void XchangString(char *s1, char *s2); void main(void); /* s1にs2をコピー */ void StringCopy(char *s1, const char *s2) { while (*s1++ = *s2++) ; } /* s1とs2を入れ替える */ void XchangString(char *s1, char *s2) { char work[80]; /* 作業用配列 */ StringCopy(work, s1); /* s1の中身を保存 */ StringCopy(s1, s2); StringCopy(s2, work); } void main(void) { char str1[80] = "Original"; char str2[80] = "New"; printf("str1:%s\n", str1); printf("str2:%s\n", str2); printf("XchangString(str1, str2);\n"); XchangString(str1, str2); /* 文字列の中身を交換 */ printf("str1:%s\n", str1); printf("str2:%s\n", str2); } |
/* (C) 2000- YFプロ. All Rights Reserved. */ 提供:C言語講座−それ自体コンパイルできる教材を使った講座です−