第2回 文字を扱う (5/11)


第1回演習:解答例


これまでは,プログラム中では数字を主に扱ってきました。今週は文字を扱う方法を学習します。

前提知識:「繰り返し」「配列」

キーワード:「文字」「文字型」「文字コード」「文字列」「ヌル文字」


文字

コンピュータの内部では,「0」と「1」の二進法の世界で,文字を直接扱うことが出来ない。そこで,各文字に番号を割り当てて,「**番の文字を表示しなさい」という命令とし,表示する際に番号を文字に変換している。
では,実際にどのようになってるのか,次のプログラムを実行して確かめよう。

#include <stdio.h>
void main()
{
    int a;

    a = 83;

    printf("数字として:%d¥n", a);
    printf("文字として:%c¥n", a);
}

どのように表示されましたか?

同じ変数を表示してるのに,結果はことなる。たねは,printf文の書式指定子です。%dの時は,変数の値が十進数で,%cの時は,変数の値の番号の文字を,それぞれ表示する。

記号 意味
%d 整数(10進数)
%o 整数(8進数)
%x 整数(16進数)
%f 浮動小数点(実数)
%c 文字(1文字)
%s 文字列(1文字以上)

では,文字と番号の関係を確認しよう。


課題1:

上のプログラムを参考に,変数の値を十進数で65から90まで1ずつ変化させていったとき,対応する文字を表示するプログラムを作成しなさい。
<注意> 1から変数を変化させると,大変な事になります。


文字と番号の関係は,下の表(文字コード表)のようになっている。例えば大文字の「」は,十進数では「65」で表される。この表を覚える必要はない。

文字 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
番号 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
文字 a b c d e f g h i j k l m n o p q r s t u v w x y z
番号 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122



文字型変数

C言語で「文字」といえばアルファベット半角文字の事で,これを格納するための変数がchar型である。
文字をプログラム中で用いるときは,シングルクォーテーションで囲む。(例:'A')
[注意]: 文字型charには,半角1文字だけしか代入できない.また,ひらかなや漢字の代入などもできない.

以下のプログラムで文字コードを確認してみてください.
  例:文字コードの値を表示するプログラム

 #include <stdio.h>
  void main()
  {
  char c;      /*  文字型の変数  */
  
  printf("1文字入力してください");
  c = getchar();  /* キーボードからの半角文字1つの入力を得て,char型を返す関数.scanfの代わり */
  
  printf("文字は %c です.¥n", c);  
  printf("文字コードは %d です.¥n", c);
  }

課題2:

上のプログラムを用いて,アルファベット以外の文字(#や@など)の文字コードを調べ,文字と対応するコードを5組以上,答えなさい。


文字列

ここまでで,1文字の扱いを学んだ。次に,複数の文字を扱う。
複数の文字を集合として扱うには,文字の配列=「文字列」を用いる。 参考:情報処理・演習1 配列のページ
文字列をC言語プログラム中で記述するためには,表現したい文字の並びをダブルクオーテーション「”」で囲む.

例:"ABC"(単にABCと書くと,変数名とみなされる)


ヌル文字

文字の配列を扱うには,文字列を構成する文字のほかに,文字の最後に終端文字として ¥0 (NULL文字,ヌル文字と言う.文字コードでは0x00)を配する規則になっている。
したがって文字型の配列のサイズは,文字数+1,即ち余分に1文字分用意する必要がある。

このことに注意して,文字列を宣言,初期化するには,必要な文字数+1の配列を確保する必要がある。たとえば,「ABCD」の4文字をしまう文字列変数を定義するには,以下のようになる。

char a[5] = "ABCD";

または,配列の要素数を省略すると,コンパイラにより自動的に「文字数+1」個の配列が用意される。

char a[] = "ABCD";

例:


#include <stdio.h>
 
void main()
{
    char a[] = "ABC012";  /*ダブルクオーテーションに注意*/
    int i;
 
    printf("文字列は%sです¥n", a); /*文字列をすべて表示する.配列の最後の¥0は表示されない!*/
 
    for(i=0; i<6; i++) {
	     printf("%d文字目は%cです.文字コードは十進数で%d,16進数で 0x%x です.¥n", i+1, a[i],  a[i], a[i]);
	     /*  %c は文字として表示,%dは十進数として,%xは16進数としてそれぞれ表示する  */
    }
}
 

文字列の入力

scanf関数を用いて,キーボードから文字列を入力する方法をマスターしよう。


#include <stdio.h>
 
void main()
{
    char str[100]; /*  ヌル文字を除く 99 字分の文字の配列を確保  */
 
    printf("文字を入力してください:");
 
    scanf("%s", str);    /*  ここに注意,strに&がつかない!  */
 
    printf("入力された文字列は%sです¥n", str);
}
 

上記のようにすると,scanfが配列 str の先頭から順にキーボードから入力した文字を格納し,最後にヌル文字を加えてくれる。scanfで文字列を入力する場合は,int, float型変数への入力と異なり,&str とはならないことに注意!
その理由は後日行うポインタの演習で判明!


課題3:

キーボードから文字列を入力すると,何文字入力されたかを画面に表示するプログラムを作成せよ。
ヒント:文字列の終わりには、必ずnull文字(¥0,0x00)置かれている。 文字列を先頭から一文字ずつ確認していき,ヌル文字だったら,その前までが文字列。

課題4:

課題3のプログラムを応用して,入力した文字列を,反転して表示するプログラムを作成せよ。
例:入力:「This is」,出力:「si sihT」