文字列
C言語はchar型配列として文字列を扱う。文字列処理は一般に大変であるため、 以下では、対象となる文字列は、簡単な半角英数字に限定する。 また、こうした制限を設けても、文字列処理は依然として面倒であるため、 「string.h」という文字列処理に関連した関数をまとめたものをインクルードして、利用すると良い。
文字列の基本
次のように配列のサイズを指定せず、文字列をchar型配列に代入することができる。 printfによって表示する際は、「%s」を用いる。
#include <stdio.h> int main(void){ char s[] ="hello"; printf("%s\n",s); return 0; }
実行結果. hello
上のプログラムで、
char s[] ="hello";
においてどのようなことが起きているか調べたい。
「hello」が5文字なので、配列s[]の要素も5個用意されるように思えるが、実際は6個用意される。6個目の要素は 文字列が終了したことを表す「0」となる。この「0」は、「null文字」とよばれる。
実際に最後に「0」(null文字) が入っていることを確認するプログラム
#include <stdio.h> int main(void){ char s[] ="hello"; int i; for(i=0;i<6;i++){ printf("s[%d]=%d\n",i,s[i]); } return 0; }
実行結果
s[0]=104 s[1]=101 s[2]=108 s[3]=108 s[4]=111 s[5]=0
上の実行結果は、文字コードが表示されている。
標準ライブラリの文字列関数
文字列処理は面倒であるため、ライブラリの関数を用いるのが便利。
文字列の長さ
文字列の長さを取得するには、strlenを用いる。
strlen(const char* s)
の形で用いて、sの文字列としての長さを返す。
Note.
「const」は、引数が「関数の中で書き変わらない」ことを意味する。 「strlen」のケースでいえば、「strlen」を使用しても、「引数s」の文字列としての長さは変わらない。 これは当然のことであるが、他の関数では関数利用時に「引数が変化するかどうか」 が自明でないケースもある。そのような場合「const」がついているかどうかは、一つの判断基準になる。
#include <stdio.h> #include <string.h> int main(void){ char s1[] ="August"; int len = strlen(s1); printf("Length of |%s| is %d.\n",s1,len); return 0; }
実行結果. Length of |August| is 6.
注:文字列の長さに「null文字」は含まれない。
文字列のコピー
あるchar型配列に文字列をコピーあるいは初期化する場合に「strcpy」を用いる。
strcpy(char* t1, const char* t2)
の形で、文字列t1に文字列t2をコピーする。
注. 第1引数には、「const」がついていない。実際、第1引数は関数利用時に書きかえられる。
#include <stdio.h> #include <string.h> int main(void){ char s1[100]; char s2[] = "September"; strcpy(s1,s2); // s1にs2をコピー printf("s1 is %s. s2 is %s.",s1,s2); return 0; }
実行結果. s1 is September. s2 is September.
文字列の連結
二つの文字列を結合する場合は、strcatを用いる。
strcat(char* t1, const char* t2)
の形で用いて、「文字列t1の後ろに文字列t2を結合させたもの」をt1に代入する。
注:t1自体が変わるので、t1のサイズとして「結合させたい二つの文字列の長さ + null文字」分のメモリ確保が必要。
#include <stdio.h> #include <string.h> int main(void) { char s1[100]="Hello"; // 念のため、大きめに取っている。 strcat(s1, "World"); printf("s1 is %s.", s1); return 0; }
実行結果. s1 is HelloWorld.
文字列の和を返す関数を自作する
文字列の結合には標準ライブラリの「strcat」を用いるが、ここでは 少し機能の異なる文字列結合関数「sumString」を自作する。
使用方法
char* sumString(const char* s1, const char* s2);
の形で用いて、文字列s1と文字列s2の文字列としての和を返す。
#include <stdio.h> #include <stdlib.h> #include <string.h> char* sumString(const char* s1, const char* s2); int main(void) { char s1[] = "Thank"; char s2[] = "you!"; char* s3 = sumString(s1, s2); printf("%s\n", s3); free(s3); return 0; } char* sumString(const char* s1, const char* s2){ size_t sumLen = strlen(s1) + strlen(s2); char* s3 = (char*)malloc(sizeof(char) * (1+sumLen)); if (s3 == NULL) { exit(1); } int i; for (i = 0; i < strlen(s1); i++) { s3[i] = s1[i]; } int k = i; for (; i <= sumLen; i++) { s3[i] = s2[i - k]; } return s3; }
実行結果. Thankyou!