今週から,新しい学習を始めます。これまでは,プログラム中では数字を主に扱ってきました。今週は文字を扱う方法を学習します。
前提知識:「繰り返し」「配列」
キーワード:「文字」「文字型」「文字コード」「文字列」「ヌル文字」
コンピュータの内部では,「0」と「1」の二進法の世界で,文字を直接扱うことが出来ない。そこで,各文字に番号を割り当てて,「**番の文字を表示しなさい」という命令とし,表示する際に番号を文字に変換している。
では,実際にどのようになってるのか,次のプログラムを実行して確かめよう。
#include <stdio.h>
void main()
{
    int a;
    a = 83;
    printf("数字として:%d¥n", a);
    printf("文字として:%c¥n", a);
}
どのように表示されましたか?
同じ変数(83)を表示してるのに,結果は異なる。種は,printf文の書式指定子です。%dの時は,変数の値が十進数で,%cの時は,変数の値の番号の文字を,それぞれ表示する。
| 記号 | 意味 | 
|---|---|
| %d | 整数(10進数) | 
| %o | 整数(8進数) | 
| %x | 整数(16進数) | 
| %f | 浮動小数点(実数) | 
| %c | 文字(1文字) | 
| %s | 文字列(1文字以上) | 
では,文字と番号の関係を確認しよう。
上のプログラムを参考に,変数の値を十進数で97から122まで1ずつ変化させていったとき,対応する文字を表示するプログラムを作成しなさい。
<注意> 1から変数を変化させると,大変な事になります。
文字と番号の関係は,下の表(文字コード表)のようになっている。例えば大文字の「A」は,十進数では「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);
  }上のプログラムを用いて,アルファベット以外の文字(#や@など)の文字コードを調べ,文字と対応するコードを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 とはならないことに注意!
その理由は後日行うポインタの演習で判明!
上記のプログラムを作成し,キーボードからいろいろな文字列を入力してみよう。ここで,100文字以上入力するとどうなるか,また,日本語を入力するとどうなるか等,試してみる。
キーボードから文字列を入力すると,何文字入力されたかを画面に表示するプログラムを作成せよ。
  ヒント:文字列の終わりには、必ずnull文字(¥0,0x00)置かれている。
文字列を先頭から一文字ずつ確認していき,ヌル文字だったら,その前までが文字列。