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 のレビューも受けられます。
すべてのチャレンジ