あれあれ〜? Arrayだぞ〜
今回はちょっとだけ込み入ったプログラムを作ります。
以下ソース
--------
#include <stdio.h>
int main(int argc,char *argv[]){
char Array[128]; //入力文字列
int i = 0; //ループインデックス
char Upper[128]; //大文字
char ch; //一時記憶
fgets(Array,127,stdin);
//入力された小文字を大文字にする、小文字以外は想定しない
while(1){
//入力の終端
if(Array[i] == '\n'){
Upper[i] = '\n';
break;
}
ch = Array[i] - 'a';
Upper[i] = ch + 'A';
i++;
}
printf("%s",Upper);
return 0;
}
--------
簡単に説明するとアルファベットの小文字を入力すると大文字に変換して返すプログラムです。
ループ部分で小文字→大文字変換をやっているのですが、今回はそこではなく配列に注目しようと思います。
char Array[128];
と書いていますこのArrayとはなんなのか?
これはchar型の変数を128個確保しています。
別に32個でも64個でもいいんですが、多めの方がその効果がわかりやすのでそうしています。
char型の変数を一つずつ定義していったら大変なのは想像がつくと思います
char a1,a2....
こういう面倒を避けるため配列はあります。
また、配列は文字列を入れるのに向いています。
fgets(Array,127,stdin);
ここでは配列Arrayに127文字読み込んでいます。
一文字少ないのはCでは文字列の終端を表すのに「\0」を入れなければならないからです。
stdinとは何か?
めっちゃざっくり書くとキーボードからの入力です、厳密にはパイプやリダイレクトといった概念もあるのですがややこしいのでstdinと書けばキーボードからの入力待ちになると思っておいてください。
次のwhile(1)は無限ループです、この辺は難しいのでまた今度やります。
話を戻して文字列に。
まずCには文字列型は存在「しません」
お前さっき文字列って言ってじゃん、ええまあそうなんですけど……
Cにおける文字列は「文字型の配列」がそれに当たります。
まず配列というのは連続した領域に保存されるのが保証されます。
つまり「ABC」という文字列があったときary[4]に保存されている場合、ary[0]がAのばあいA[1]はAの保存場所のひとつ先を指していてBが入っているということです。
そしてA[3]には「\0」という終端文字が入っています。
ここで\0は終端文字で一文字なのに注意してください「\」と「0」ではなく「\0」で一文字です、これをNULL文字と呼びます。
このNULL文字が文字列の終端を示しています。
つまりwhile(1)では文字列を先頭から終端まで走査して変換しています「\0」でなく「\n」という改行文字で判別しているのはキーボード入力を確定するときに押すエンターで改行文字が入るからです。
改行文字は終端文字とは違うことに注意してください。
ch = Array[i] - 'a';
Upper[i] = ch + 'A';
ここで変換しているのですが、今はこうやれば変換できるくらいに思っておいてください。
興味がある方はソースをコピペして動かしてみてくださいね! じゃあまた!