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); ここには大まかに書いてしまいましたが、実は奥が深くて、こんな書き方をしたら 怒られてしまうかもしまいません(汗)。とりあえず、詳細は参考書に譲ります。
© Copyright 2024 ExpyDoc