【C言語入門講座】10章.文字列の基本(初期化・代入・比較・連結・逆順)

C言語入門レッスン

☜前の章へ 配列の基本(宣言・初期化・追加・要素数・多次元配列)
☞次の章へ ポインタとは


【C言語入門講座】は全13章から構成される、初心者向けのC言語学習コンテンツです。1章から13章まで学習して頂くことでC言語の基礎を学習することができます。

この記事で分かること
  1. 文字列を宣言する方法
  2. 宣言された文字列を初期化(代入)する方法
  3. 文字列の宣言と初期化を同時にする方法
  4. 文字列の出力方法
  5. 文字列をキーボード入力する方法
  6. 文字列を比較する方法
  7. 文字列の長さを取得する方法
  8. 文字列を連結する方法
  9. 文字列をコピー(切り出し)する方法
  10. 文字列を逆順にする方法

ここでは文字列の基本的な使い方から、文字列の基本的な操作までを学んでいきます。

文字列の基本的な使い方

※上記の青い文字から読みたい項目へ移動することができます

①文字列を宣言する方法

文字列を宣言する方法
  • 型名 変数名[要素数]
#include <stdio.h>

int main(void) {
    // 配列の宣言
    char sintyo_a[6];

    return 0;
}

C言語で文字列を宣言するためには、char型の配列を宣言します。

②宣言された文字列を初期化(代入)する方法

文字列を初期化(代入)する方法
  • 変数名[インデックス番号] = ’文字’

    変数名[インデックス番号] = ’\0′
#include <stdio.h>

int main(void) {
    // 配列の宣言
    char sintyo_a[6];

    // 代入、文字列ではなく、文字の配列
    sintyo_a[0] = 'H';
    sintyo_a[1] = 'e';
    sintyo_a[2] = 'l';
    sintyo_a[3] = 'l';
    sintyo_a[4] = 'o';
    sintyo_a[5] = '\0';

    return 0;
}

C言語で配列を使うためには、配列の一番最後の要素に終端文字(\0)を追加する必要があります。

③文字列の宣言と初期化を同時にする方法

文字列の宣言と初期化を同時にする方法
  • 型名 変数名[要素数] = {‘文字’, ‘文字’, …,’\0′}
  • 型名 変数名[要素数] = {“文字列”}
  • 型名 変数名[] = {‘文字’, ‘文字’, …,’\0′}
  • 型名 変数名[] = {“文字列”}
#include <stdio.h>

int main(void) {
    // C言語の文字列は終端文字(\0)を最後に入れる必要がある
    char sintyo_a[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

    // ダブルクォーテーションで文字列を囲んで初期化もできる
    // この場合終端文字は自動で追加される
    char sintyo_b[6] = {"Hello"};

    // 要素数を指定しなくても初期化できる
    char sintyo_c[] = {'H', 'e', 'l', 'l', 'o', '\0'};

    char sintyo_d[] = {"Hello"};

    return 0;
}

文字を1つ1つ'(シングルクォーテーション)で囲むことで宣言と初期化を同時に行うことが出来ます。

“ダブルクォーテーションで文字列を囲むことでも宣言と初期化を同時に行うことが出来ます。この場合、終端文字が自動的に追加されます。

④文字列の出力方法

文字列の宣言と初期化を同時にする方法
  • printf(“%s”, 変数名);
#include <stdio.h>

int main(void) {
    // C言語の文字列は終端文字(\0)を最後に入れる必要がある
    char sintyo_a[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

    // ダブルクォーテーションで文字列を囲んで初期化もできる
    // この場合終端文字は自動で追加される
    char sintyo_b[6] = {"Hello"};

    // 要素数を指定しなくても初期化できる
    char sintyo_c[] = {'H', 'e', 'l', 'l', 'o', '\0'};

    char sintyo_d[] = {"Hello"};

    printf("sintyo_a=");
    // ループで表示することができる
    for (int i = 0; i < 5; i++)
    {
        printf("%c",sintyo_a[i]);
    }

    printf("\n");
    //文字列だと%sとするだけで表示できる
    printf("sintyo_b=%s\n", sintyo_b);
    printf("sintyo_c=%s\n", sintyo_c);
    printf("sintyo_d=%s\n", sintyo_d);

    return 0;
}

出力結果

sintyo_a=Hello sintyo_b=Hello sintyo_c=Hello sintyo_d=Hello

ループで1文字1文字出力することもできますが、文字列の場合、printfで%sを使用すると簡単に出力することができます。

文字列をキーボード入力する方法

#include <stdio.h>

int main(void) {
    char s[10];
    printf("何か文字列を入力してください。\n");
    scanf("%s", s);
    printf("入力された文字列=%s\n", s);

    return 0;
}

scanf関数を使用するとキーボードから文字を入力して、その値を使用することができます。
キーボード入力を使うことで、例えばクイズゲームなどを作成することが出来ます。

これまで学習した知識でクイズゲームは作成可能です。是非色々なものの作成にチャレンジしてみて下さい。

文字列の基本操作と応用

※上記の青い文字から読みたい項目へ移動することができます

①文字列の比較|strcmp関数の使い方

strcmp関数の使い方
  • strcmp(変数名A, 変数名B);
#include <stdio.h>
#include <string.h>

int main(void) {
    char str1[] = "Hello";
    char str2[] = "World";

    int result = strcmp(str1, str2);

    if (result == 0) {
        printf("str1とstr2は等しい\n");
    } else {
        printf("str1とstr2は等しくない\n");
    }

    return 0;
}

出力結果

str1とstr2は等しくない

strcmp関数は、#include <string.h>と冒頭に書くことで使用できます。

文字列が同じであれば、0を返します。

②文字列の比較|strncmp関数の使い方

strncmp関数の使い方
  • strncmp(変数名A, 変数名B, 数字);
#include <stdio.h>
#include <string.h>

int main(void) {
    char str1[] = "Hello";
    char str2[] = "Helee";

    int result = strncmp(str1, str2, 3);

    if (result == 0) {
        printf("str1とstr2は3文字まで等しい\n");
    } else {
        printf("str1とstr2は等しくない\n");
    }

    return 0;
}

出力結果

str1とstr2は3文字まで等しい

strncmp関数は、#include <string.h>と冒頭に書くことで使用できます。

strncmp関数は、比較したい数字分の文字を文字列の先頭から比較します。
文字列が同じであれば、0を返します。

③文字列の長さの取得|strlen関数の使い方

strlen関数の使い方
  • strlen(変数名);
#include <stdio.h>
#include <string.h>

int main(void) {
    char str1[] = "Hello";

    int length = strlen(str1);

    printf("文字列の長さ: %d\n", length);

    return 0;
}

出力結果

文字列の長さ: 5

strlen関数は、#include <string.h>と冒頭に書くことで使用できます。

strlen関数は、文字列の終端文字を除いた文字数を取得します。

④文字列の連結|strcat関数の使い方

strcat関数の使い方
  • strcat(変数名A, 変数名B);
#include <stdio.h>
#include <string.h>

int main(void) {
    char str1[20] = "Hello";
    char str2[] = " World";

    strcat(str1, str2);

    printf("連結後の文字列: %s\n", str1);

    return 0;
}

出力結果

連結後の文字列: Hello World

strcat関数は、#include <string.h>と冒頭に書くことで使用できます。

strcat関数は、第一引数の変数に第二引数の変数を連結します。

⑤文字列の連結|strncat関数の使い方

strncat関数の使い方
  • strncat(変数名A, 変数名B, 数字(連結後の最大文字数));
#include <stdio.h>
#include <string.h>

int main(void) {
    char str1[20] = "Hello";
    char str2[] = "1234567891011121314151617";

    strncat(str1, str2, sizeof(str1) - strlen(str1) - 1);

    printf("連結後の文字列: %s\n", str1);

    return 0;
}

出力結果

連結後の文字列: Hello12345678910111

strncat関数は、#include <string.h>と冒頭に書くことで使用できます。

strncat関数は、第一引数の変数に第二引数の変数を連結します。
第三引数で連結後の最大文字数を指定することが出来ます。

これにより、バッファオーバーフローを防ぐことができます。

⑥文字列のコピー(切り出し)|strncpy関数の使い方

strncpy関数の使い方
  • strncpy(変数名A(コピー先), 変数名B(コピー元), 数字(コピーする文字数));
#include <stdio.h>
#include <string.h>

int main(void) {
    char str[] = "Hello, World!";
    char sub_str[6];  // 切り出したい部分のサイズ+1(終端文字分)の配列を用意

    // strから部分文字列を切り出す
    strncpy(sub_str, str + 7, 5);
    sub_str[5] = '\0';  // 切り出した部分の終端文字を追加

    // 切り出した部分文字列を表示
    printf("切り出した部分文字列: %s\n", sub_str);

    return 0;
}

出力結果

切り出した部分文字列: World

strncpy関数は、#include <string.h>と冒頭に書くことで使用できます。

strncpy関数は、第一引数の変数に第二引数の変数をコピーします。
第二引数に変数のみ書く場合は、1文字目からコピーされますが、「+ 7」のように、先頭から何文字目からコピーするかを指定することもできます。

第三引数でコピーしたい文字数を指定します。

⑦文字列を逆順にする方法

#include <stdio.h>
#include <string.h>

void reverseString(char str[]) {
    int length = strlen(str);
    int start = 0;
    int end = length - 1;

    while (start < end) {
        // 先頭と末尾の文字を交換
        char temp = str[start];
        str[start] = str[end];
        str[end] = temp;

        // 次の位置に移動
        start++;
        end--;
    }
}

int main(void) {
    char str[] = "Hello, World!";

    // 文字列を逆順にする
    reverseString(str);

    // 逆順になった文字列を表示
    printf("逆順になった文字列: %s\n", str);

    return 0;
}

出力結果

逆順になった文字列: !dlroW ,olleH

文字列を逆順にするために、reverseString関数を作成しました。

配列も関数の引数として渡すことが出来ます。

配列を関数の引数で渡すと、関数内で配列を変更することが出来ます。

ループ内で文字列の先頭と末尾を交換して文字列を逆順にしています。


練習問題

配列を”ありがとう”で初期化し表示してみましょう

#include <stdio.h>

int main() {
    // 初期化
    char message[] = {"ありがとう"};
     

    // 表示
    printf("メッセージ:");

    printf("%s\n", message);
    

    return 0;
}

キーボードから自分の名前を入力し、表示してみましょう

#include <stdio.h>

int main() {
    char s[10];

    printf("名前を入力してください\n");
    scanf("%s", s);
    printf("名前:%s\n", s);

    return 0;
}

☜前の章へ 配列の基本(宣言・初期化・追加・要素数・多次元配列)
☞次の章へ ポインタとは

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