第 10 回 - 文字列操作(1)

[5/30, 2006 H.Aman]
67x27(1669bytes)   67x27(1669bytes) 【課題 2】

例題 2

getchar 関数を使って文字を 1 つずつ順番に読み込み, それらを文字列として生成しなさい. ただし,文字列の長さは 64 未満とする.

コーディング例

     1	/*
     2	 * プログラミング演習 第 10 回
     3	 * [例題 2]
     4	 * (C) 2006 Hirohisa AMAN <aman@cs.ehime-u.ac.jp, aman@computer.org>
     5	 */
     6	#include <stdio.h>
     7	
     8	int main(void){
     9	  char str[64];
    10	  int i, c;
    11	
    12	  i = 0;
    13	  while ( (c = getchar()) != EOF ){
    14	    str[i] = c;
    15	    i++;
    16	  }
    17	  str[i] = '\0'; /* 文字列の終端記号 */
    18	
    19	  printf("入力文字列: %s\n", str);
    20	
    21	  return 0;
    22	}
     
※左端の数字は行番号であり,ソースコードには含まれない点に注意!

コンパイル & 実行例

     $ gcc example10_2.c [Enter]
     $ ./a.out [Enter]
     $ aman@computer.org[Enter]
     [Ctrl]+[d]   ←  入力の終了をプログラムに通知
     入力文字列: aman@computer.org
     

解説

プログラムの内容でいえば 例題1 と大きな違いはありません.
読み込んだ文字を順番に配列へ格納し(14 行目), 最後に '\0' を書き込んでいる(17 行目)だけです.

むしろ getchar を使った文字の読み込みの方に戸惑うかもしれません.
getchar は標準入力(つまりはキーボード)から 1 文字ずつ文字を読み込むための関数です. 1 回呼び出すと 1 文字読み,その文字コード(ASCII コード) を戻り値として返します.
これは int 型変数から見ればただの整数(文字コード)ですが, char 型変数からはその文字コードに対応した文字に見えます.

    13	  while ( (c = getchar()) != EOF ){
    14	    str[i] = c;
    15	    i++;
    16	  }
    
にあるように, while 文の条件部の中で int 型変数 c に getchar の戻り値を代入しています. この時点で c には読み込んだ文字の 文字コード(整数) が代入されます.
もしも入力が終了していた(ファイル終端:EOF = End Of File)場合は 繰り返しも終了します.(※実際には EOF = -1 と定義されています.)
14 行目ではこの文字コード c を str[i] に代入しています. str[i] は char 型ですので,この時点で 文字コードに対応する「文字」 として解釈されます.