C言語講座 配列と文字列

C言語講座 配列と文字列
Ver 0.3
文字を表示しよう。
printf(“%c%c\n”,75,51);
まず、思い出してほしいのは「%cが文字をそこにひとつ表示する」ということ。
CはcharacterのCで、変数型でもchar型っていうのがありましたね^^
上の文を実行すると「K3」と表示されます。これが意味する事は文字がコンピュー
タの中で数字で表されていると言うことですね。
char ch=‘a’;
printf(“%d = %c\n”,ch,ch);
まず、シングルクオーテーションで一文字を囲むと、それはその文字を現す「数
字」に変わるわけです。つまり、変数chには97が入っています。
だから上の文を実行すると、「97 = a」と表示されるはずです。
この数字のことを「ascii code(アスキーコード)」と呼びます。
理解を深めタイ
入力した文字を数字と文字で表すプログラム
Main(void)
{ char ch=0;
printf(“>”);
scanf(“%c”,&ch);
printf(“%c = %d\n”,ch,ch);
}
文字を「a」から「z」まで表示するプログラム
Main(void)
{ char ch=0;
for(ch=‘a’;ch<=‘z’;ch++){
printf(“%c “,ch);
}
}
‘a’=97,’b’=98,’c’=99,….という規則性がある。
アスキーコード表
<アドバイス>
Aとaは32だけ離れている。もし、
小文字から大文字に変換した
いのなら、文字コードから32を
引けば、実現できそうですね。
注)
DEC:10進数
HEX:16進数
追加(アスキーコード)
入力した文字が、大文字だったら、そのまま、小文字だったら大文字に変換するプログラム
main(void)
{
char ch;
printf(“please type any key:”);
scanf(“%c”,ch);
if(‘a’<= ch && ch <=‘z’){
ch = ch + ’A’ – ‘a’;
}
printf(“Result is %c.\n”,ch);
}
ch = ch+ ‘A’ –’a’;
という行はアスキーコード表を見てもらうとわかるだろうが、大文字に変換する計算である。
a(アスキーコード97)をA(アスキーコード65)に変換するには、現在のアスキーコードから32
をひく(つまり+(65 – 97))すればよいということ。
配列1 配列とは
配列は変数の拡張だと考えるので、とりあえず、変数について心配な人は復習
しましょう^^。
配列とはいってしまえば、変数がずらっと並んだものをさします。とりあえず、図
a[0] a[1] a[2] a[3] a[4] a[5] a[6]
….
a[N]
というような感じに数字等を入れる箱を連続で(番号をつけて)並んでいるのが、
「配列」となります。「そんなにたくさん変数つくったって、しょうがないじゃん」って
突っ込まれるかもしれませんが、配列はけっこー便利です。まぁ、ひとつ例を挙げ
れば、100個の数字を入力して、それをすべて記憶(変数に入れる)するには、ど
うすればいいか。変数名をa,b,c,dと100個宣言するのは、明らかにおかしいです
よね。そこで、配列が登場するわけです。
配列2 配列を使う
宣言
変数型 配列名[配列数];
例) int array[500];
char moji[30];
注) 実際にa[10]と宣言すると、箱はa[0]からa[9]までの10個の箱が用意されます
内容の参照
例 printf(“%d”,a[2]);
a[0]=a[2];
if(a[10]==0){}
初期化
int array[10]={0,1,2,3,4,5,6,7,8,9};
これで、配列に0,1,2,3・・・・の数字が入るわけです。もし
int array[10]={0};
と省略されると、配列が全部0となる。
配列3 配列の利用法
10個の数字を入力して、それをすべて足すプログラム
main(void)
{
int a[10];
int i=0,ans=0;
}
for(i=0;i<10;i++){
printf(“>”);
a[i]=getchar();
}
for(i=0;i<10;i++){
ans=ans+a[i];
}
printf(“ANS = %d\n”,ans);
/* これが、配列の宣言 */
/* 一文字読み込む */
どうかな、便利さがわかると思う。繰り返しの中で、配列を次々に読むことが可能なのだ。
getchar()は一文字だけ読み取ることを指す。
配列による文字列の表示
いままでやったなかで文字列を表現するにはこうすればよい。
char str[9]={‘h’,’o’,’s’,’e’,’i’,’u’,’n’,’i’,’v’};
for(i=0;i<9;i++){
printf(“%c”,str[i]);
}
入力だったら、
char str[9];
for(i=0;i<9;i++){
scanf(“%c”,str[i]);
}
/* %cであることに注意。 */
もっと便利に・・
一文字ずつ入力するのでは、プログラムが見にくくてしょうがないでしょ
う。そこで、C言語ではこのような機能を提供してくれている。
printf(“%s”,str);
scanf(“%s”,str);
printf(“%s”,str);はstr配列の中の文字を頭から読んで表示してくれます。
例)str[0]=‘N’,str[1]=‘A’,str[2]=‘R’,str[3]=‘C’
なら、NARCと表示される
scanf(“%s”,str);は、エンターか、スペースが押されるまでに押された文字、
つまり入力文字列を配列の先頭から入れて言ってくれる。
これで、文字列を入力し、それを表示するプログラムがすぐに作れる気が
するね。
注)scanf(“ %s ”,ココ);が配列の場合、&はつけないこととする。
Scanf後の配列の中身
scanf(“%s”,str);で「keisanz」と入力すると配列には下のようにデータが入る
‘k’
‘e’
‘i’
‘s’
‘a’
‘n’
‘z’
‘\0’
a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7]
注目してもらいたいのは最後の’\0’で、これはNULL文字といって、「ここで文字
列が終わりですよ」という記号なのです。Printf(“%s”,str);の中身は多分
for(i=0;str[i]!=‘\0’;i++){
処理
}
となっているはずです。ですから、配列を宣言するとき、ぎりぎりに宣言するの
ではなく、NULL文字のひとつを考えて宣言するようにしましょう。( N個の文字
数を使用したいとき、 char str[N+1];と宣言しよう。)
文字列と御戯れ
入力された文字列の長さを表示するプログラム
Main(void)
{ char str[50];
int i=0;
scanf(“%s”,str);
for(i=0;str[i]!=‘\0’;i++){}
/* NULL文字まで、iを加算し続ける それ以外何もしない*/
printf(“STR_LENGTH = %d\n”,i);
}
入力された文字列の中の「.(ドット)」を改行に変換するプログラム
Main(void)
{ char str[50];
int i=0;
scanf(“%s”,str);
for(i=0;str[i]!=‘\0’;i++){
if(str[i]==‘.’){
str[i]=‘\n’;
}
}
printf(“%s\n”,str);
}
/* もし、ドットのアスキーコードならば、 */
/* 改行コードに変換 */
課題
課題
まず、文字列を入力する。もし、それが小文字だったら大文字に、大文字だっ
たら小文字に、アルファベットでなければ「.(ドット)」に変換して表示させるプ
ログラム。
やる気のある人へ
入力した文字列を左右逆さまに「変換」し、printf(“%s”)で表示するプログラム
を書け。例)「keisangijyutukenkyukai」→「iakuyknekutuyijgnasiek」
ヒント:配列のi番目とj番目を交換する方法
tmp=a[i];
a[i]=a[j];
a[j]=tmp;
その他の入出力関数
getchar();
文字を一文字だけキーボードから読み取る関数。戻り値はint型が望ましい。
例)
int ch;
ch=getchar();
putchar();
文字を一文字だけ表示。
例)
putchar(ch);
putchar(‘A’);
その他の入出力関数
gets(配列);
一行入力。Scanfだと、スペースなどが入力できないが、gets()は、エンターが押され
るまでを、すべて指定の配列に入れてくれる。まさにゲッツ
例)
gets(str);
puts(配列);
一行出力。強制的に改行されるため、微妙に使いにくい。僕はprintf()を薦めます
例)
put(str);
ここには大まかに書いてしまいましたが、実は奥が深くて、こんな書き方をしたら
怒られてしまうかもしまいません(汗)。とりあえず、詳細は参考書に譲ります。