C++: C言語形式文字列

最終更新:2026-08-31

C++ではstd::stringが推奨されるが、Cスタイル文字列(char配列)の理解も重要——多くのレガシーコードや低レベルAPIで使用されている。


1. C言語形式文字列とは何か?

(1) 1.1 定義

C言語形式文字列はNULL終端されたcharの配列。

CPP
char str[] = "Hello"; // {'H', 'e', 'l', 'l', 'o', '\0'}

(2) 1.2 NULL終端

すべてのC言語形式文字列はNULL文字'\0')で終わる。これが文字列の終わりを示す。

TEXT 📖 参照専用
文字列:  H    e    l    l    o   \0
インデックス: 0    1    2    3    4    5
💡 ヒント: "Hello"は5文字だが、配列サイズは6(NULL終端を含む)。



2. 宣言と初期化

(1) 2.1 文字列リテラル

CPP
char str[] = "Hello"; // サイズは自動的に6になる
char str[10] = "Hello"; // 残りは\0で埋められる

(2) 2.2 文字配列

CPP
char str[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

(3) 2.3 ポインタ

CPP
const char* str = "Hello"; // 文字列リテラルへのポインタ


3. 文字列関数

<cstring>ヘッダーで提供される。

(1) 3.1 strlen

文字列の長さを返す(NULL終端を除く)。

CPP
#include <cstring>
#include <iostream>

int main() {
    char str[] = "Hello";
    std::cout << strlen(str) << std::endl; // 5
    return 0;
}

(2) 3.2 strcpy

文字列をコピー。

CPP
#include <cstring>
#include <iostream>

int main() {
    char src[] = "Hello";
    char dest[10];
    strcpy(dest, src);
    std::cout << dest << std::endl; // Hello
    return 0;
}
⚠️ 注意: コピー先が十分なサイズか確認すること!

(3) 3.3 strcat

文字列を連結。

CPP
#include <cstring>
#include <iostream>

int main() {
    char str[20] = "Hello";
    strcat(str, " World");
    std::cout << str << std::endl; // Hello World
    return 0;
}

(4) 3.4 strcmp

文字列を比較。

CPP
#include <cstring>
#include <iostream>

int main() {
    char s1[] = "Apple";
    char s2[] = "Banana";
    
    if (strcmp(s1, s2) < 0) {
        std::cout << s1 << " < " << s2 << std::endl;
    }
    return 0;
}


4. 文字列入力

(1) 4.1 cin

CPP
char name[50];
std::cin >> name; // スペースで止まる

(2) 4.2 cin.getline

CPP
char sentence[100];
std::cin.getline(sentence, 100); // 行全体を読み取る

▶ サンプル 1:文字列の長さを計算(難易度 ⭐)

CPP
#include <iostream>
#include <cstring>

int main() {
    char str[100];
    std::cout << "文字列を入力: ";
    std::cin.getline(str, 100);
    
    std::cout << "長さ: " << strlen(str) << std::endl;
    return 0;
}
▶ 試してみよう

▶ サンプル 2:文字列を逆順に(難易度 ⭐⭐)

CPP
#include <iostream>
#include <cstring>

void reverseString(char str[]) {
    int len = strlen(str);
    for (int i = 0; i < len / 2; i++) {
        char temp = str[i];
        str[i] = str[len - 1 - i];
        str[len - 1 - i] = temp;
    }
}

int main() {
    char str[] = "Hello";
    reverseString(str);
    std::cout << str << std::endl; // olleH
    return 0;
}
▶ 試してみよう

▶ サンプル 3:文字列内の文字をカウント(難易度 ⭐⭐)

CPP
#include <iostream>
#include <cstring>

int countChar(const char str[], char ch) {
    int count = 0;
    for (int i = 0; str[i] != '\0'; i++) {
        if (str[i] == ch) {
            count++;
        }
    }
    return count;
}

int main() {
    char text[] = "Hello World";
    char target = 'l';
    
    std::cout << "'" << target << "'の出現回数: "
              << countChar(text, target) << std::endl;
    return 0;
}
▶ 試してみよう

❓ よくある質問

Q C言語形式文字列とstd::stringの違いは?
A std::stringはサイズ可変、メモリ管理自動、安全。C言語形式文字列は固定サイズ、手動管理、バグの原因になりやすい。
Q なぜC言語形式文字列を学ぶ必要がある?
A レガシーコード、C API、パフォーマンス重視の場面で使用される。理解しておくと役立つ。
Q バッファオーバーフローとは?
A 配列サイズを超えて書き込むこと。C言語形式文字列でよく発生する危険なバグ。常にサイズを確認すること。

📖 まとめ


📝 練習問題

  1. 初級(難易度 ⭐): C言語形式文字列の長さをstrlenを使わずに計算。

  2. 中級(難易度 ⭐⭐): 文字列内の特定の文字をカウントする関数を書く。

  3. 上級(難易度 ⭐⭐⭐): 2つの文字列を連結し、結果を新しい配列に格納する関数を書く。

Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%