文字列

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!