第4回目 文字列・その2(5/01)

□ メモ

emacs 上で,M-x shell とすると emacs からコンソールが使えるようになる.この画面は,「カット & ペースト」できるので,emacsの「マルチウインドウ」や「バッファ切り替え」と組合せると,プログラムの実行結果を載せるときに便利である.

今日の目標

■ 文字コード

文字コードとは、「a」、「b」、「c」や「あ」、「ア」、「亜」などの文字に割り当てられた番号である。文字コードの種類により、同じ文字であっても番号が異なる。

□ 演習1

list0401.c は,eucコードを入力し,対応する文字を表示するプログラムである.EUCコード表を参照しながら,動作を確認せよ.
/* list0401.c */
#include <stdio.h>

main()
{
 int n1,n2;

 scanf(”%x %x”,&n1,&n2);
 putchar((unsigned char)n1);
 putchar((unsigned char)n2);
 putchar(’\n’);
}
list0402.c は,16進数を2進数に変換して表示するプログラムである.list0401.c と組合せて次の処理をするプログラムを作れ.2つの数を入力した後,対応する文字を表示し,さらに,2進数を表示する.⇒ prac0401.c
/* list0402.c */
#include <stdio.h>

void print_bin(int num)
{
  int i;
  unsigned char c1;

  if( num < 0x100 ){
    for( c1 = 0x80,i=0; i<8; i++,c1=c1 >> 1 ){
      if( num & c1 ){
        putchar(’1’);
      }else{
        putchar(’0’);
      }
      num = num & 〜c1;
    }
  }
}

main()
{
  int n1;

  scanf(”%x”,&n1);
  print_bin(n1);
}
以下は実行結果の例
[tokuhisa@chain lect04]$ gcc prac0401.c 
[tokuhisa@chain lect04]$ ./a.out
a3 e1
10100011 11100001
a
[tokuhisa@chain lect04]$ ./a.out
41 42
01000001 01000010
AB
[tokuhisa@chain lect04]$ 

■ 文字の比較

文字の比較とは,文字コード(数値)の比較
→ したがって,文字を扱うプログラムを作成する際,まず最初に使用する文字コードを確認する.
→ 通常は,ASCIIコードおよび日本語EUCコードを用いる.
(理由)日本語の文字は,種類が256以上あるため,1バイトでは表現しきれない.そのため2バイト文字を使用する.ASCIIコードとEUCコードは,最上位ビットを見るだけで,区別がつくため,混在しても不具合が生じにくい.
たとえば,文字列から1文字を消去する場合,最上位ビットを見て0ならば1バイトの消去,1ならば2バイトの消去を行えばよい.処理が単純である.

□ 演習2

list0403.c は,2つのASCII文字を入力し,大小比較をするプログラムである.
/* list0403.c */
#include <stdio.h>
main()
{
  unsigned char c1[4],c2[4];

  printf(”1つ目の文字を入力して下さい: ”);
  fgets(c1,4,stdin);
  printf(”2つ目の文字を入力して下さい: ”);
  fgets(c2,4,stdin);

  printf(”%c <=> %c\n”,c1[0],c2[0]);

  if(c1[0] == c2[0])
    printf(”等しい\”);
  else if(c1[0] > c2[0])
    printf(”1つ目の文字が大きい\n”);
  else
    printf(”2つ目の文字が大きい\n”);
}
  1. list0403.c の c1 および c2 は,4バイドの空間が確保されている.fgets では,4バイトの空間には,任意の2バイト,改行文字,および,終端文字を格納する.したがって,2バイト文字がちょうど1つ格納できる. list0403.c を使って「亜」と「愛」の大小を比較せよ.eucコードを見て大小比較の結果を考察せよ.
  2. 2バイト文字も正しく大小比較ができるように変更せよ.⇒ prac0402.c

■ 文字コードによる配列変数のアクセス

文字コードは数値であるので,配列番号に使うことができる.たとえばASCII文字「a」は 0x61 であり,10進数では 97 という数値である.
list0404.c は,「a」から「z」までのASCII文字が入力されることを想定したプログラムである.「a」が入力されると,c1[0]-'a' の結果は 0 であり,yomi[0] が表示される.
/* list0404.c */
#include <stdio.h>

main()
{
  char *yomi[] = {
    "エー", "ビー", "シー", "ディー", "イー", "エフ", "ジー", 
    "エイチ", "アイ", "ジェイ", "ケイ", "エル", "エム", "エヌ", 
    "オー", "ピー", "キュー", "アール", "エス", "ティー", "ユー", 
    "ブイ", "ダブリュ", "エックス", "ワイ", "ゼット"};

  unsigned char c1[4];

  fgets(c1,4,stdin);

  printf(”%s\n”,yomi[c1[0]−’a’]);
}

□ 演習3

「A」から「Z」のASCII文字および「A」から「Z」,「a」から「z」のEUC文字が入力されても読みがなを表示するように改良せよ.また,対象外の入力の場合は,「なし」と表示せよ.⇒ prac0403.c

■ 宿題

以下のいずれか1つのプログラムを作成し,ソースファイルおよび動作結果を提出せよ.ソースファイルには,1行ごとに手書きでコメントを書くこと.
(c) Masato TOKUHISA, 2003, April. 29