Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

【C言語】文字列の配列を逆順に並べ替える方法を解説

この記事では、「文字列の配列が与えられるので、それを逆順に並べ替えるCプログラムを作成する」という問題を扱います。

配列の要素を逆順にするというのは、最後の要素を先頭に、最後から2番目の要素を2番目に……といった具合に、前後を入れ替えていくことを意味します。

問題を理解するための具体例

まずは入力と出力の例を見てみましょう。

入力

strarr[] = {"learn", "programming", "at", "tutorialspoint"}

出力

strarr[] = {"tutorialspoint", "at", "programming", "learn"}

このように、配列内の文字列の順序が完全に反転しています。

解決のアプローチ

この問題は、両端からの2つのポインタ(インデックス)を使う手法で効率よく解けます。手順は以下の通りです。

  • 先頭を指す start と、末尾を指す end の2つの変数を用意する。
  • startend が指す要素同士を交換する。
  • start を1つ進め、end を1つ戻す。
  • 2つのポインタが交差するまで上記を繰り返す。

この方法なら、追加の配列を用意する必要がなく、元の配列をその場で(in-placeで)反転できます。計算量は O(n/2)、つまり O(n) です。

文字列の配列を逆順にするCプログラム

実際のコードを見てみましょう。

サンプルコード

#include <stdio.h>
#include <string.h>

// 文字列の配列を逆順にする関数
void ReverseStringArray(char* strarr[], int n) {
    char* temp;
    int end = n - 1;
    for (int start = 0; start < end; start++) {
        // 先頭と末尾の要素を交換
        temp = strarr[start];
        strarr[start] = strarr[end];
        strarr[end] = temp;
        end--;
    }
}

int main() {
    char* strarr[] = {"learn", "programming", "at", "tutorialspoint"};
    int n = sizeof(strarr) / sizeof(strarr[0]);
    
    // 反転前の配列を表示
    for (int i = 0; i < n; i++)
        printf("%s ", strarr[i]);
    printf("\n");
    
    // 配列を反転
    ReverseStringArray(strarr, n);
    
    // 反転後の配列を表示
    for (int i = 0; i < n; i++)
        printf("%s ", strarr[i]);
    
    return 0;
}

実行結果

learn programming at tutorialspoint
tutorialspoint at programming learn

コードのポイント解説

  • 要素数の取得: sizeof(strarr) / sizeof(strarr[0]) によって、配列全体のサイズを1要素あたりのサイズで割ることで、配列の要素数 n を求めています。
  • 交換処理: 一時変数 temp を使って、char* 型のポインタ(文字列への参照)同士を入れ替えています。文字列の中身自体はコピーせず、参照だけを入れ替えるため非常に効率的です。
  • ループ条件: start < end を条件にしているため、真ん中の要素(奇数個の場合)はそのまま残り、無駄な交換が発生しません。

このように、2つのポインタを使ったシンプルなアルゴリズムで、文字列の配列を簡単に逆順にすることができます。

  1. C言語で配列の全要素の積を求めるプログラム

    n個の要素を含む配列 arr[n] が与えられたとき、その配列内のすべての要素の積を求めることが課題となります。例えば、7つの要素からなる配列 arr[7] の場合、積は以下のように計算されます。例入力: arr[] = { 10, 20, 3, 4, 8 } 出力: 19200 説明: 10 × 20 × 3 × 4 × 8 = 19200 入力: arr[] = { 1, 2, 3, 4, 3, 2, 1 } 出力: 144解き方のアプローチ配列を入力として受け取る。配列のサイズを求める。配列を反復処理しながら、各要素を掛け合わせる。結果を表示する。アルゴリズム開始 関数 int pro

  2. C言語で配列が回文かどうかを判定するプログラム

    回文とは任意のサイズ n の配列 arr[] が与えられたとき、その配列が回文(パリンドローム)かどうかを判定するのが本記事の目的です。回文とは、前から読んでも後ろから読んでも同じになる並びのことで、MADAM や NAMAN といった文字列が代表的な例として挙げられます。配列が回文かどうかを確認するには、配列を先頭からと末尾から同時に走査し、対応する要素同士を比較していきます。入力例と出力例Input: arr[] = {1, 0, 0, 1} Output: 配列は回文です Input: arr[] = {1, 2, 3, 4, 5} Output: 配列は回文ではありません考え方(アプ