C・C++で文字列の母音を数える
このレッスンでは、大文字と小文字の違いを無視して、1行の文章に含まれる母音を数えます。
はじめに
母音を数える問題は、文字列の文字を1つずつたどる、文字を小文字にそろえる、文字が集合に含まれるかを調べる、という3つの技術を組み合わせたものです。英語の母音はa、e、i、o、uです。
大切なポイント
- コンパイラの警告(compiler warning)を有効にして、すべての警告を直しましょう。
- それぞれの値のデータ型と寿命(lifetime)をしっかり理解しましょう。
- 入力データと配列のインデックスの範囲は必ずチェックしましょう。
CとC++のコード例
C
main.c
#include <ctype.h>
#include <stdio.h>
#include <string.h>
int main(void) {
const char *text = "Code Utility"; int count = 0;
// strchr performs a compact membership check.
for (; *text; ++text) if (strchr("aeiou", tolower((unsigned char)*text))) ++count;
printf("vowels=%d\n", count);
}
vowels=5
C++
main.cpp
#include <algorithm>
#include <cctype>
#include <iostream>
#include <string>
int main() {
std::string text = "Code Utility";
// count_if counts characters accepted by the predicate.
auto vowels = std::count_if(text.begin(), text.end(), [](unsigned char c) {
return std::string("aeiou").find(std::tolower(c)) != std::string::npos;
});
std::cout << "vowels=" << vowels << '\n';
}
vowels=5
CとC++の比較
関数tolowerは各文字を小文字にするので、大文字と小文字が同じように扱われます。特殊な文字で問題が起きないよう、tolowerに渡す前に文字をunsigned charに変換しています。strchr("aeiou", ...)は、文字が母音の文字列に含まれていればNULL以外のポインタを返すので、カウンターが増えます。"Code Utility"には母音が5つあります。
C
Cは小さな手続き型の関数を使い、データがメモリ上でどう表されるかをそのまま見せます。
C++
C++は低レベルの操作もできるまま、ライブラリの型やより安全な抽象化を加えます。
発展問題
両方のバージョンを実行し、コードを書き換えて、それぞれの言語がもたらす安全性の違いを観察しましょう。
- 不正な入力や境界の値で試しましょう。
- 警告を増やすフラグ-Wall -Wextra -Wpedanticを付けてコンパイルしましょう。
- 共通の宣言はヘッダーファイルに、実装は別のファイルに分けましょう。
チャレンジで練習する
このレッスンの内容を使って実際の問題を解きましょう。各チャレンジはブラウザで動き、すぐにテストされ、AI のレビューも受けられます。
すべてのチャレンジ