【C言語】文字列の配列を逆順に並べ替える方法を解説
この記事では、「文字列の配列が与えられるので、それを逆順に並べ替えるCプログラムを作成する」という問題を扱います。
配列の要素を逆順にするというのは、最後の要素を先頭に、最後から2番目の要素を2番目に……といった具合に、前後を入れ替えていくことを意味します。
問題を理解するための具体例
まずは入力と出力の例を見てみましょう。
入力
strarr[] = {"learn", "programming", "at", "tutorialspoint"}出力
strarr[] = {"tutorialspoint", "at", "programming", "learn"}このように、配列内の文字列の順序が完全に反転しています。
解決のアプローチ
この問題は、両端からの2つのポインタ(インデックス)を使う手法で効率よく解けます。手順は以下の通りです。
- 先頭を指す
startと、末尾を指すendの2つの変数を用意する。 startとendが指す要素同士を交換する。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つのポインタを使ったシンプルなアルゴリズムで、文字列の配列を簡単に逆順にすることができます。
-
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
-
C言語で配列が回文かどうかを判定するプログラム
回文とは任意のサイズ n の配列 arr[] が与えられたとき、その配列が回文(パリンドローム)かどうかを判定するのが本記事の目的です。回文とは、前から読んでも後ろから読んでも同じになる並びのことで、MADAM や NAMAN といった文字列が代表的な例として挙げられます。配列が回文かどうかを確認するには、配列を先頭からと末尾から同時に走査し、対応する要素同士を比較していきます。入力例と出力例Input: arr[] = {1, 0, 0, 1} Output: 配列は回文です Input: arr[] = {1, 2, 3, 4, 5} Output: 配列は回文ではありません考え方(アプ