初心者向けC/C++演習

C・C++で文字列を逆順にする

このレッスンでは、対称な位置の文字を入れ替えて、文字列をそのメモリ上で直接逆順にします。

はじめに

文字列の反転は、インデックスの使い方と、新しい文字列を作らずにその場(in-place)で要素を入れ替える方法を練習するのにぴったりです。最初の文字と最後の文字を入れ替え、真ん中へ向かって進むのが考え方です。

大切なポイント

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

CとC++のコード例

C
実行 →
main.c
#include <stdio.h>
#include <string.h>
int main(void) {
    char text[] = "CodeUtility"; size_t length = strlen(text);
    // Swap mirrored characters in place.
    for (size_t i = 0; i < length / 2; ++i) {
        char temporary = text[i]; text[i] = text[length - 1 - i]; text[length - 1 - i] = temporary;
    }
    puts(text);
}
実行結果
ytilitUedoC
C++
実行 →
main.cpp
#include <algorithm>
#include <iostream>
#include <string>
int main() {
    std::string text = "CodeUtility";
    // reverse applies swaps across the selected range.
    std::reverse(text.begin(), text.end());
    std::cout << text << '\n';
}
実行結果
ytilitUedoC

CとC++の比較

ループは一時変数temporaryを使ってtext[i]とtext[length - 1 - i]を入れ替え、2つの位置が文字列の真ん中で出会うまで続けます。変更できるように、文字列はchar text[]という配列で宣言する必要がある点に注意してください。表示される結果はytilitUedoCです。

C

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

C++

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

発展問題

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

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

チャレンジで練習する

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

すべてのチャレンジ