月ノ書

【C言語】文字列の基本と安全な扱い方

文字列とは

C言語では、文字列は char 型の配列 として扱われます。そして必ず最後に NULL文字(’\0’) が付くのが大きな特徴です

#include <stdio.h>

int main(void) {
    char str[] = "Hello, C!";
    printf("%s\n", str);
    return 0;
}

%s は文字列を表示するためのフォーマット指定子で、str は char 配列として渡されています
見た目は一つのデータに見えても、中身は「文字の並び」になっています

文字列操作関数

C言語には文字列専用の関数が <string.h> に用意されています
自分で1文字ずつ処理しなくても、よく使う操作は関数で行えます

文字列の長さを調べる

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

int main(void) {
    char str[] = "Hello, C!";
    printf("文字列の長さ: %lu\n", strlen(str));
    return 0;
}

strlenNULL文字を含まない文字数 を返します
配列サイズとは違う点に注意が必要です

文字列のコピー

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

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

    strcpy(str2, str1);
    printf("コピー後: %s\n", str2);
    return 0;
}

コピー先の配列サイズが足りないと、メモリ破壊の原因になります
C言語では 安全かどうかを自分で管理する必要がある という点がとても重要です

文字列の結合

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

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

    strcat(str1, str2);
    printf("結合後: %s\n", str1);
    return 0;
}

結合後の長さを考えて、十分なサイズを確保しておく必要があります

文字列の比較

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

int main(void) {
    char str1[] = "abc";
    char str2[] = "abd";

    int result = strcmp(str1, str2);
    if(result == 0) {
        printf("同じ文字列\n");
    } else if(result < 0) {
        printf("str1 < str2\n");
    } else {
        printf("str1 > str2\n");
    }
    return 0;
}

strcmp は文字コード順で比較します
文字列同士は == では比較できない点も初心者がつまずきやすいポイントです

文字列の検索

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

int main(void) {
    char str[] = "Hello, C!";
    char *p = strchr(str, 'C');

    if(p != NULL) {
        printf("見つかった位置: %ld\n", p - str);
    } else {
        printf("見つからなかった\n");
    }
    return 0;
}

strchr は最初に見つかった文字のポインタを返します。見つからなかった場合は NULL

strchr は見つかった位置の ポインタ を返します
見つからない場合は NULL が返るので、必ずチェックが必要です

まと

このあたりを押さえておくと、C言語での文字列処理が一気に安定するよ

学習進捗

0
Would love your thoughts, please comment.x