C・C++で文字列の英字の出現回数を数える
このレッスンでは、26個の要素を持つ配列を使って、文字列の中で各小文字が何回出てくるかを数えます。
はじめに
度数表は、各文字とカウンターを結び付けます。小文字はaからzまでの26文字しかないので、26個の要素の配列を使えます。0番目の要素がaを、1番目の要素がbを数え、以下同様です。
大切なポイント
- コンパイラの警告(compiler warning)を有効にして、すべての警告を直しましょう。
- それぞれの値のデータ型と寿命(lifetime)をしっかり理解しましょう。
- 入力データと配列のインデックスの範囲は必ずチェックしましょう。
CとC++のコード例
C
main.c
#include <stdio.h>
int main(void) {
const char *text = "banana"; int counts[26] = {0};
// Convert each lowercase letter to an array index.
for (; *text; ++text) ++counts[*text - 'a'];
for (int i = 0; i < 26; ++i) if (counts[i]) printf("%c=%d\n", 'a' + i, counts[i]);
}
a=3
b=1
n=2
C++
main.cpp
#include <array>
#include <iostream>
#include <string>
int main() {
std::string text = "banana"; std::array<int, 26> counts{};
// Convert each lowercase letter to an array index.
for (char character : text) ++counts[character - 'a'];
for (size_t i = 0; i < counts.size(); ++i) if (counts[i]) std::cout << char('a' + i) << '=' << counts[i] << '\n';
}
a=3
b=1
n=2
CとC++の比較
英字のコードは連続しているので、式*text - 'a'で英字を0から25のインデックスに変換できます。プログラムはその位置のカウンターを増やし、2つ目のループでカウンターが0でない文字だけを表示します。"banana"なら、結果はa=3、b=1、n=2です。
C
Cは小さな手続き型の関数を使い、データがメモリ上でどう表されるかをそのまま見せます。
C++
C++は低レベルの操作もできるまま、ライブラリの型やより安全な抽象化を加えます。
発展問題
両方のバージョンを実行し、コードを書き換えて、それぞれの言語がもたらす安全性の違いを観察しましょう。
- 不正な入力や境界の値で試しましょう。
- 警告を増やすフラグ-Wall -Wextra -Wpedanticを付けてコンパイルしましょう。
- 共通の宣言はヘッダーファイルに、実装は別のファイルに分けましょう。
チャレンジで練習する
このレッスンの内容を使って実際の問題を解きましょう。各チャレンジはブラウザで動き、すぐにテストされ、AI のレビューも受けられます。
すべてのチャレンジ