どうも多浪Fランぼっち底辺大学生です。
今回は1次元配列に格納された文字列を逆順にして表示する方法を紹介します。
- 1次元文字配列の基本的な使い方を確認する
- 1次元配列に格納された文字列を逆順に表示する
解答例やおすすめの参考書の紹介をしますので是非とも読み進めて下さい!
それでは早速紹介していきヤース。
Contents
【C言語】配列の基本な使い方・概念
配列とは、同じ型の変数の集まりをひとまとまりにしたモノです。
例えば以下の様な時に使います。
5人のとあるテストの点数(整数型)を一人一人ずつ変数を宣言して格納する。
int a=80;
int b=56;
int c=72;
int d=49;
int e=98;
この5つの宣言はいづれもint(整数)型で、一つ一つ宣言し値を格納するのは面倒
全員のテストの点数を出力(表示)する際も printf(“%d\n”,a)の様に1つ1つ記述するのも時間の無駄です。
そこで、配列の出番ですねぇ!!
int test[5]={80,56,72,49,98};
又は
int test[]={80,56,72,49,98};
ホラっ、同じ型のデータをひとまとまりに出来る!!!
コレが配列の初期化です。
っと、こんな場合に遭遇したときに配列が活躍するわけです。
それでは、配列の基本について見て行きましょう。
まずは、配列の宣言方法について知りましょう。
(↓↓配列の宣言方法↓↓)
データ型 配列名[要素数];
カッコ([])内の要素数とは、配列の大きさを表します。
配列名[] ←1次元
配列名[][] ←2次元
1次元配列を学べば2次元配列へとアップグレードできます。
しかし、今回は1次元配列だけを扱っていきますのでご安心を(-ω-)/
先ほどの具体例を取り上げてみますと、
int test[5]={80,56,72,49,98};
上記の様に5つのデータが格納できることを示しているわけです!(^^)!
そして、カンマ(,)で区切られたデータは、以下の様に対応します。
test[0]=80
test[1]=56
test[2]=72
test[3]=49
test[4]=98
このカッコ内([])の数字の事をインデックスだとか要素番号・添え字と呼びます。
インデックスは0から始まる事を忘れないようにしてください!!
こんな感じが配列の使い方の基本です。
同じ型のデータをひとまとまりにするわけですから、int型以外にも double, float, charも配列として使用できます。
それでは、肝心の文字型配列について詳しく見ていきましょう。
文字列型配列だけは”ヌル文字”に気を付けよう
文字型配列だけに関しては”ヌル文字”を考慮しなければなりません。
ヌル文字(別称:ナル文字)は”\0″と表記されるものです(円マークと数字の0)
ヌル文字は、文字列の末尾を表す重要な文字列として機能しています。
例えば、以下の様に文字列を配列に初期化(代入)したとき、
char name[10]=”Tadokoro”;
文字列10個分を確保した記憶域には
name[10]={‘T’,’a’,’d’,’o’,’k’,’o’,’r’,’o’,’\0′,’\0′};
の様に1文字ずつデータが保存されているわけです。
(使用されなかった記憶領域にはヌル文字が入ります)
また、
name[]=”Tadokoro”;
と初期化することで
name={‘T’,’a’,’d’,’o’,’k’,’o’,’r’,’o’,’\0′,};
と言った感じで、ヌル文字を末尾に1つだけ含む配列を自動生成できます
ヌル文字があることで「何がありがたいか?」と言うと、配列に格納された文字列の長さが簡単に調べられることなんですよね。
「インデックスを0から始めヌル文字が現れるまで線形探索する」ことで長さが分かる。
長さが分かることによって、値を逆順に並べ替えることが出来ます。
逆に、長さが分かっていないとコンパイルエラーを起こし、上手く実行に移れませんからね(-ω-)/
【解答例】配列に格納された文字列を逆順に表示する
それでは、大学の課題で出題された(わたくしの在籍している大学ですが・・・)問題の解答例を紹介します。
文字列(char)型配列の値を逆順に表示する
先ほど紹介した”ヌル文字(\0)”に注意してプログラムを作成しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#include <stdio.h> #define N 100 /*変数Nに絶対値100を格納*/ /*プロトタイプ宣言*/ int get_length(char str[]); /*文字列の長さを返す関数*/ int main(){ int i; int len; /*文字列の長さを格納する変数*/ char moji[N];/*文字配列宣言*/ printf("文字列:"); scanf("%s",moji); len=get_length(moji); /*文字列の長さを取得*/ printf("文字列の長さ:%d\n",len); for (i=len-1;i>=0;i--){ /*インデックスがヌル文字の1つ前から0まで*/ printf("%c",moji[i]); /*一文字ずつ出力*/ } printf("\n"); } int get_length(char str[]){ int i,j=0; for (i=0;str[i] != '\0';i++){ /*ヌル文字が現れるまで繰り返す*/ j+=1; } return j; } |
>>実行結果<<
文字列:Tadokoro
文字列の長さ:8
orokodaT
こんな感じになります。
ソースコード内にコメントを残しておきましたので、大体理解してもらえるのではないかなーと思います。
要点は、文字列の長さを正確に取得する点ですね。
文字列の長さが分かれば、文字配列のインデックスを降順にずらしていけばいいだけの話です。
因みに、文字列の長さを取得するヘッダファイルがあるんですよねぇ。
とにかく、ソースコードを出してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include<stdio.h> #include<string.h> /*ヘッダーファイルの呼び出し*/ #define N 100 int main(){ int i; char name[N]; printf("名前を入力してください:"); scanf("%s",name); for (i=strlen(name)-1;i>=0;i--){ /*ここでヘッダーファイル内の関数を使う*/ printf("%c",name[i]); } printf("\n"); } |
>>実行結果<<
名前を入力してください:Kouji
ijuoK
っね!!!
- 「string.h」のヘッダーファイルを呼び出す
- strlen(配列名)
たったのこれだけで1つ目のソースコードより僅かに記述量が減りました。
1つ目のソースコードで記述した「get_length」関数が「strlen()」に置き換わっただけなのです。
大体、大学の課題で出される場合は「string.h」を用いない様に出題されることが多いです。
でも、まぁこちらも参考にしてみて下さい(´・ω・)
【紹介】心強いおともになるC言語の参考書を紹介
基本中の基本なので、良く分からない人は復習するか、以下の書籍をセットで購入して基礎から勉強しましょう。
- 新・明解C言語入門編
- 新・解きながら学ぶC言語
↑↑2つでセット!!↑↑
「新・明解C言語入門編」に関しては、図解や要点が丁寧に記載されており、C言語初学者が学びやすい参考書となっています。
※今回の文字列を逆順に表示する要点も記載されています。
ところで、何故2冊なのかと言いますと・・・・・
「新・明解C言語入門編」には超絶分かりやすい説明があり、演習問題まで載っています。
そして、この演習問題の解答が「新・解きながら学ぶC言語」に記載されているからです。
これで理解できなければ「C言語は諦めろ!!」って言うくらい分かりやすい参考書と、知識や考え方の定着を補助する問題集がセットなら、本当に心強いですよ。
ネットでチラチラ解答例を調べたりするより、ちゃんと教科書や問題集を手元に置いて学習したほうが、絶対に効率が良いです!
増して、この2つで勉強していれば、テスト勉強にも困りません(‘ω’)ノ

【まとめ】しっかり勉強していないと、いずれは詰むゾ!
以上が「配列を使って数字や文字を逆順を表示する」考え方と解答例、おすすめの書籍の紹介でした。
C言語に限ったことではないですが、基本的な事柄の要点を押さえていないと後々詰んでしまいます・・・・
これを機に、効率よく勉強しましょう。