C言語 文字列を逆順に並べ替える方法
スポンサーリンク
このドキュメントの内容は、以下の通りです。
はじめに
私たちは、言葉を逆に順序で読むことがあります。たとえば、「てぶくろ」を「ろくぶて」と読むことです。これは、「倒語」(とうご)と呼ばれます。プログラムで、文字列を逆順に並べ替える必要性があるのかどうかはわかりませんが、文字列を逆順にする方法を考えてみました。
今回は、C言語での実装を考えてみます。
C言語で文字列を逆に並べ替える方法
メモリの内容を逆に並べ替えるには、低位メモリと高位メモリの内容を入れ替えていくことで可能です。
char str[] = "hoge";
上記の文字列があったときに、以下の手順を行います。
str[0] と str[3] を入れ替えます。
str[1] と str[2] を入れ替えます。
これで、全部入れ替えが完了です。
文字列の文字を1つ1つ、添え字で入れ替えるプログラムを書くのは大変です。
もっと簡単に実現する方法は、ループを回して、先頭と最後の両方から文字列の真ん中を目指しながら、文字を置き換えていくことです。メモリの内容を逆順に並べ替えるには、下記のプログラムで並べ替えることが可能です。
文字列の最初と文字列の最後の文字のポインタを渡します。
int reverse(char *start, char *end) { char t = 0; while (start < end) { t = *end; *end-- = *start; *start++ =t; } return (0); }
2つの変数の中身を入れ替える場合は、たいてい、もう1つのテンポラリーの変数が必要になります。上記の例では、ポインタをインクリメントとデクリメントをしていますが、添え字用の変数を2つ使って実装しても構いません。そのあたりは、好みだと思います。
文字列の内容を逆順に並べ替えるには、下記の関数に渡すことで可能です。
int strreverse(char *start)
文字列の先頭のポインタを関数に渡します。関数内では、文字列の長さを strlen で調べ、文字列の最後の文字のポインタを取得します。そして、前述の reverse() を呼び出します。
int strreverse(char *start) { char *end = & start [ strlen(start) - 1 ]; return reverse(start, end); }
サンプルコード
C言語での実装例を以下に示します。
#include <stdio.h> #include <stdlib.h> #include <string.h> int reverse(char *start, char *end) { char t = 0; if(!start || !end) { return (-1); } while (start < end) { t = *end; *end-- = *start; *start++ =t; } return (0); } int strreverse(char *start) { if(! start) { return (-1); } char *end = & start [ strlen(start) - 1 ]; return reverse(start, end); } void reverse_test(char *str) { printf ("%s => ", str); strreverse (str); printf ("%s\n", str); } int main (int argc, char *argv[]) { char b1[32] = ""; char b2[32] = "ab"; char b3[32] = "321"; char b4[32] = "4321"; reverse_test ( b1 ); reverse_test ( b2 ); reverse_test ( b3 ); reverse_test ( b4 ); strreverse (NULL); reverse (NULL, NULL); exit (EXIT_SUCCESS); }
実行例
実行結果は以下のようになります。空の文字列を渡した場合は、なにもしません。文字の長さが長くなっても、問題なく入れ替えが行われていることが確認できました。
% cc strreverse.c % ./a.out => ab => ba 321 => 123 4321 => 1234
最後に
C言語で、文字列を逆にするサンプルプログラムを書いてみましたが、いまいち使いどころが思いつきませんでした。スポンサーリンク
スポンサーリンク
いつもシェア、ありがとうございます!
もっと情報を探しませんか?
関連記事
最近の記事
- パナソニック ジェットウォッシャードルツ EW-DJ61-Wのホースの修理
- LinuxセキュリティモジュールIntegrity Policy Enforcement
- アマゾンのEcho Show 5を買ったのでレビューします
- アマゾンのサイバーマンデーはAlexa Echo Show 5が安い
- Android スマートフォン OnePlus 7T と OnePlus 7の違い
- Android スマートフォン OnePlus 7 をAndroid10にアップデートしてみた
- クレジットカードのバーチャルカードの比較のまとめ
- 活動量計 Xiaomi Mi Band 4を買ってみたのでレビュー
- Android スマートフォン OnePlus 7 のレビュー
- AliExpressでスマートフォンを買い物してみた
- パソコンのホコリ対策 レンジフードフィルターと養生テープ
- 80PLUS GOLDのPC電源ユニットAntec NeoEco 750 Goldのレビュー
- イギリスの付加価値税 VAT は払い戻しを受けられる
- イギリスのロンドンでスーツケースなど荷物を預けられる場所は
- イギリスのロンドンで地下鉄やバスに乗るならオイスターカードを使おう
- イギリスのヒースロー空港からロンドン市内への行き方
- 航空便でほかの航空会社に乗り継ぎがある場合のオンラインチェックイン
- SFC会員がANA便ではなくベトナム航空のコードシェアを試して解ったこと
- ベトナムの入国審査でeチケットの掲示が必要だった話
- シアトルの交通ICカードはオルカカード(Orca)です
人気のページ
- Windows7 IME 辞書ツールで単語の登録に失敗しました
- C言語 popen()でコマンドを実行して出力を読み込む
- Windows7で休止状態にする方法
- CentOS MySQLの起動、停止、再起動
- loggerコマンドでsyslogにエラーを出力する方法
- パソコンパーツの買取をしてくれる店のまとめ
- Java Mapの使い方 get(),put(),remove(),size(),clear()
- 楽天のRポイントカードを作ってみた
- iPhone 5 から iPhone 6 に乗り換えたのでレビュー
- netstatコマンドのステータスの意味
スポンサーリンク
過去ログ
2020 : 01 02 03 04 05 06 07 08 09 10 11 122019 : 01 02 03 04 05 06 07 08 09 10 11 12
2018 : 01 02 03 04 05 06 07 08 09 10 11 12
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12