5.5 文字ポインタと関数, 演習5-3 K&R プログラミング言語C
2010年02月05日
5.5 文字ポインタと関数
以下のように文字列定数の内容を書き換えようとすると失敗する。
#include <stdio.h> int main(void) { char amessage[] = "now is the time"; /* 配列 */ char *pmessage = "now is the time"; /* ポインタ */ printf("amessage[] => %s\n", amessage); printf("*pmessage => %s\n", pmessage); printf("----------\n"); amessage[0] = 'N'; /* 配列版の先頭文字を書き換える。 */ printf("amessage[] => %s\n", amessage); *pmessage = 'N'; /* ポインタ版の先頭文字を書き換える。 */ printf("*pmessage => %s\n", pmessage); return 0; }
実行結果
$ ./str_test amessage[] => now is the time *pmessage => now is the time ---------- amessage[] => Now is the time Bus error
ポインタの指し示す先を配列版の先頭に変更すると、ポインタ版の文字の変更は配列版の変更となる。
#include <stdio.h> int main(void) { char amessage[] = "now is the time"; /* 配列 */ char *pmessage = "now is the time"; /* ポインタ */ printf("amessage[] => %s\n", amessage); printf("*pmessage => %s\n", pmessage); printf("----------\n"); pmessage = &amessage[0]; /* ポインタを配列版の文字列を指し示すように変更する。 */ *pmessage = 'N'; /* 先頭文字を書き換える。 => 配列版の文字列が書き換えられる。 */ printf("amessage[] => %s\n", amessage); printf("*pmessage => %s\n", pmessage); return 0; }
実行結果
$ ./str amessage[] => now is the time *pmessage => now is the time ---------- amessage[] => Now is the time *pmessage => Now is the time
演習5-3
#include <stdio.h> #include <string.h> /* strcpy を使うため */ void my_strcat(char*, char*); void my_strcat2(char*, char*); int main(void) { char s1[] = "hello"; char s2[] = ", world."; char s3[] = "from "; char s4[] = "Japan."; my_strcat(s1, s2); printf("my_strcat(s1, s2); => %s\n", s1); my_strcat2(s3, s4); printf("my_strcat2(s3, s4); => %s\n", s3); return 0; } void my_strcat(char *s, char *t) { /* s の指し示す文字が真の間(終端文字の'\0'に達するまで)ポインタをインクリメントする。 */ while (*s) s++; /* *t を *s に代入し、代入した文字が終端文字'\0'でなければ、それぞれのポインタをインクリメントしてループを繰り返す。 */ while (*s++ = *t++) ; } /* strcpy を使った版。while の条件節を少しわかりやすくした。 */ void my_strcat2(char *s, char *t) { while (*s != '\0') s++; strcpy(s, t); /* strcpy が開始される時点で s は '\0' を指している。 */ }
実行結果
$ ./ex5-3 my_strcat(s1, s2); => hello, world. my_strcat2(s3, s4); => from Japan.
プログラミング言語C 第2版 ANSI規格準拠
posted with amazlet at 09.11.27
B.W. カーニハン D.M. リッチー
共立出版
売り上げランキング: 9726
共立出版
売り上げランキング: 9726