【C言語】文字列の使い方

C言語

この記事では、C言語で文字列を扱う方法を解説します。C言語では、Stringなどの文字列を扱うための型がありません。なので、文字型であるcharを使って文字列を扱います。それでは、C言語で文字列を扱う方法を見ていきましょう!

文字列を扱う方法

C言語で文字列を扱うには、「char型の配列」または「char型のポインタ」を使います。また、文字列の最後には終端文字\0を入れる決まりになっています。

char型の配列

char型の配列を使った文字列の使い方を見ていきます。char型の配列を宣言するには、変数名のあとに[]を使って文字列の長さ(サイズ)を指定します。

char 変数名[文字列の長さ];

文字列の初期化

以下のように、宣言と初期化を同時に行うことができます。

char 変数名[文字列の長さ] = {'文字1', '文字2', ..., '文字N'};

// 文字列の長さを省略できる
char 変数名[] = {'文字1', '文字2', ..., '文字N'};

また、文字列リテラルで初期化することもできます。

char 変数名[文字列の長さ] = "文字列リテラル";

// 文字列の長さを省略できる
char 変数名[] = "文字列リテラル";

文字列の長さを指定する場合は、終端文字を含めた長さを指定する必要があります。例えば「Hello」で初期化したい場合、文字列の長さに「6」を指定します。

char s[6] = "Hello";

また、文字列を初期化すると自動で最後に終端文字を付けてくれます。

サンプル

以下のコードでは、文字列を宣言・初期化して色々な方法で出力しています。

#include <stdio.h>
 
int main(void) {

    // 文字列を宣言・初期化
    char text[] = "Hello";
    // 文字列の長さ
    int len = sizeof(text);

    // %sで文字列を出力できます
    printf("text: %s\n", text);

    // 1文字ずつ出力
    for (int i = 0; i < len; i++)
    {
        printf("%d: %c\n", i+1, text[i]);
    }
    
    // 最後の文字が終端文字かどうか
    if(text[len-1] == '\0')
    {
        printf("%d番目の文字は終端文字です\n", len);
    }
 
    return 0;
}

実行結果

text: Hello
1: H
2: e
3: l
4: l
5: o
6: 
6番目の文字は終端文字です

char型のポインタ

char型のポインタは、以下のように宣言・初期化することができます。

char* ポインタ名 = "文字列リテラル";

サンプル

先ほどのサンプルコードをchar型のポインタを使って書き換えてみます。

#include <stdio.h>

// 文字列を扱うためのヘッダーファイル(後述)
#include <string.h> 
 
int main(void) {

    // 文字列を宣言・初期化
    char* text = "Hello";
    // 文字列の長さを関数で測る(終端文字は含まれない)
    int length = strlen(text) + 1;

    // %sで文字列を出力できます
    printf("text: %s\n", text);

    // 1文字ずつ出力
    for (int i = 0; i < length; i++)
    {
        printf("%d: %c\n", i+1, text[i]);
    }
    
    // 最後の文字が終端文字かどうか
    if(text[length-1] == '\0')
    {
        printf("%d番目の文字は終端文字です\n", length);
    }
 
    return 0;
}

実行結果

text: Hello
1: H
2: e
3: l
4: l
5: o
6: 
6番目の文字は終端文字です

文字列を扱う関数

C言語には、文字列を扱うための関数が標準ライブラリに多数用意されています。これらの関数を使用するには「string.h」をインクルードする必要があります。

文字列を長さを取得[strlen]

引数に指定した文字列の終端文字を除いた長さを取得します。

#include <stdio.h>
#include <string.h> // インクルード
 
int main(void) {

    char* text = "Hello";
    int len = strlen(text);

    printf("文字列の長さ: %d\n", len);
 
    return 0;
}

実行結果

文字列の長さ: 5

文字列をコピーする[strcpy、strncpy]

文字列をコピーするには、strcpyまたはstrncpy関数を使います。strncpy関数は、文字数を指定してコピーします。

#include <stdio.h>
#include <string.h> // インクルード
 
int main(void) {

    char text[] = "Hello";
    char cpy1[8], cpy2[8];

    // コピー
    strcpy(cpy1, text);
    printf("cpy1: %s\n", cpy1);
    
    // 文字数を指定してコピー
    strncpy(cpy2, text, 2);
    printf("cpy2: %s\n", cpy2);
 
    return 0;
}

実行結果

cpy1: Hello
cpy2: He

文字列を連結する[strcat、sprintf]

文字列を連結するには、strcat関数を使います。第一引数の文字列に第二引数の文字列を連結させます。

#include <stdio.h>
#include <string.h> // インクルード
 
int main(void) {
    char str1[16] = "tanaka ";
    char str2[] = "taro";
    
    // 文字列の連結
    strcat(str1, str2);
    printf("str1: %s\n", str1);
    
    return 0;
}

実行結果

str1: tanaka taro

3つ以上の文字列を連結させたい場合は、sprintf関数を使います。

#include stdio.h
#include string.h // インクルード
 
int main(void) {
    char* str1 = "ab";
    char* str2 = "cd";
    char* str3 = "ef";

    char str[32];

    // sprintf(代入する文字列名, "出力文字列書式", 文字列1, 文字列2, ...)
    sprintf(str, "%s %s %s", str1, str2, str3);

    printf("%s\n", str);
    
    return 0;
}

実行結果

ab cd ef

文字列を比較する[strcmp]

文字列を比較するには、strcmp関数を使います。引数に指定した2つの文字列が等しければ整数値の0が返されます。

#include <stdio.h>
#include <string.h> // インクルード
 
int main(void) {
    char* str1 = "ab";
    char* str2 = "ab";
    char* str3 = "cd";

    printf("str1 == str2: %d\n", strcmp(str1, str2));
    printf("str1 == str2: %d\n", strcmp(str1, str3));
}

実行結果

str1 == str2: 0
str1 == str2: -2

文字の検索[strchr、strstr]

文字列中の文字を検索するには、strchr関数を使います。第一引数に指定した文字列の中から第二引数で指定した文字を探し、最初に見つけた文字の位置をポインタで返します。

#include <stdio.h>
#include <string.h> // インクルード
 
int main(void) {
    char* str = "abcd abcd";
    char* p;

    p = strchr(str, 'c');
    printf("%s\n", p);
}

実行結果

cd abcd

文字列中の文字列を検索するには、strstr関数を使います。

#include <stdio.h>
#include <string.h> // インクルード
 
int main(void) {
    char* str = "abcd abcd";
    char* p;

    p = strstr(str, "bc");
    printf("%s\n", p);
}

実行結果

bcd abcd

まとめ

この記事では、C言語で文字列を扱う方法を解説しました。文字列を扱うには、char型の配列、またはポインタを使います。

また、string.hの関数も、とても便利なのでよく覚えておきましょう!

それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ

タイトルとURLをコピーしました