C/C++の基礎

C・C++の配列と文字列

このレッスンでは、CとC++で固定長の配列をたどり、文字列の長さを安全に求めます。

はじめに

配列は、同じ型の要素をメモリ上に連続して並べたものです。Cの文字列は、ヌル文字'\0'で終わる文字の配列です。一方C++のstd::stringは、自分でメモリを管理し、文字列の長さを常に知っています。

大切なポイント

  • コンパイラの警告(compiler warning)を有効にして、すべての警告を直しましょう。
  • それぞれの値のデータ型と寿命(lifetime)をしっかり理解しましょう。
  • 入力データと配列のインデックスの範囲は必ずチェックしましょう。

動きで理解する

C言語の文字列は'\0'で終わる文字の配列です。文字をクリックすると、インデックスとメモリアドレスが表示されます。

CとC++のコード例

C
実行 →
main.c
#include <stdio.h>
#include <string.h>

int main(void) {
    int values[] = {3, 5, 8, 13};
    char name[] = "Ada";
    size_t count = sizeof values / sizeof values[0];
    printf("%s: %zu values, %zu letters\n", name, count, strlen(name));
    return 0;
}
実行結果
Ada: 4 values, 3 letters
C++
実行 →
main.cpp
#include <array>
#include <iostream>
#include <string>

int main() {
    std::array values{3, 5, 8, 13};
    std::string name = "Ada";
    std::cout << name << ": " << values.size()
              << " values, " << name.size() << " letters\n";
}
実行結果
Ada: 4 values, 3 letters

CとC++の比較

式sizeof values / sizeof values[0]は、同じ関数内で宣言した配列の要素数を計算できますが、ポインタとして関数に渡された配列には使えません。strlen関数は'\0'が見つかるまで1文字ずつたどって長さを求めますが、std::string::size()は長さをすぐに返します。

C

Cは小さな手続き型の関数を使い、データがメモリ上でどう表されるかをそのまま見せます。

C++

C++は低レベルの操作もできるまま、ライブラリの型やより安全な抽象化を加えます。

発展問題

両方のバージョンを実行し、コードを書き換えて、それぞれの言語がもたらす安全性の違いを観察しましょう。

  • 不正な入力や境界の値で試しましょう。
  • 警告を増やすフラグ-Wall -Wextra -Wpedanticを付けてコンパイルしましょう。
  • 共通の宣言はヘッダーファイルに、実装は別のファイルに分けましょう。

チャレンジで練習する

このレッスンの内容を使って実際の問題を解きましょう。各チャレンジはブラウザで動き、すぐにテストされ、AI のレビューも受けられます。

すべてのチャレンジ