◎第8回 文字データの扱い
文字列と配列
◇下へ・一覧へ
○テキスト
4章(4.1,4.2)
◇下へ・上へ
○配列 添字つき変数
同じ型の変数をメモリ内の連続した場所に並べたもの
番号で順に取り扱える。個々の変数を配列要素と呼ぶ。
( 添字 subscript )
配列の宣言
int a[10]; 10個の整数変数を並べた配列
C では a[0]からa[9]が扱える
(Pascal では a[1] から a[10])
double b[101]; 101個の double 変数を並べた配列
(C言語での添字の使い方)
2次元配列 添字が二つある配列
C や Pascal では、「配列の配列」と考える。
int a[3][2]; 整数2個の配列を三つ並べたもの
(メモリ中の順番
a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1])
◇下へ・上へ
○文字の表現
文字:数値(文字コード)に置き換える
文字情報の送り手と受け手でコード体系がちがうと「文字化け」が生じる。
・英数字英記号の場合
ASCII(American National Standard Code for Information Interchange)
7ビット(0-127) … C言語では8ビット charを使う
ASCII' + カナ = JIS(8ビット) … 8ビットchar ( unsigned char )
ASCII符号表(psfile)
・全角かな漢字の場合
漢字を含めて8(7)ビット+8(7)ビット…JIS(16ビット)
英数字2文字分
・英数字と漢字の混在
JIS漢字 (切り換えコード) ASCII (切り換えコード)…
切り換えコードは不便
JIS 切り換え方式、メールなど(7bitでOK:多言語OK:処理が複雑)
EUC 処理がもっとも容易(8ビットのJISとの混在ができない)
SJIS 処理がやや容易(8ビットJISとの混在可能)
制御文字:文字ではないが、改行などの動作を指定するコード
(制御文字の例)
◇下へ・上へ
○文字データの扱い(C言語)
・1つの文字変数には、char 1バイト(8ビット)の整数(普通は文字コード)で
表せる1つの文字しか入らない
Cのプログラム中で 'a' と書くと、「aのコード」を意味する
・複数の文字(文字列)を扱う場合には文字数に応じた配列を使う
(例1) char moji[5]; …… 文字変数の配列moji[5]を宣言
moji[0] = 'a'; …… aの文字コードが入っている
moji[1] = 'b'; …… bの文字コードが入っている
moji[2] = 'c'; …… cの文字コードが入っている。これだけではC言語の文字列にはならない!
moji[3] = 0; …… 文字列の終りを表すヌル文字必要
(例2) static char moji[5] = "abc"; …… 文字変数の配列mojiに文字列定数"abc"
を入れてみよう
このように入力すると(例1)と同じことになる。中身を除いてみると
moji[0] には aの文字コードが入っている
moji[1] には bの文字コードが入っている
moji[2] には cの文字コードが入っている
moji[3] には 文字コード0(NULL)が自動的に入っている
文字(定数):'a'のように単一引用符の中に1文字を書く
文字定数の値はコードの数値
文字列(定数):"abc"のように2重引用符で囲まれた文字の列
各要素が1文字である配列
○注意事項
・unix のファイル中では、linefeed '\n' を「行の終り」の印として用いる。
msdos などのファイル中では、CR LF "\r\n"' を「行の終り」の印として
用いる。
・unixでは、画面表示のときは、\n を \r\n に自動的に変換している。
また入力の時は、Returnキーに対応する \r を \n に自動的に変換している。
◇下へ・上へ
○演習8
8.1 文字列の長さを求めるプログラムstrlen.c( PAD psfile)の
文字型配列 a[2000]; に文字列を入力し、その長さを求めよ。
また、漢字は2文字と数えられてしまうことを確認せよ。
8.2 文字列をコピーするプログラム strcpy.c( PAD psfile)の
文字型配列 a[2000] に文字列を入力し、b[2000] にコピーせよ。
(2000 全部コピーするのは無駄である)
8.3 文字列中の大文字(A-Z)の数を数えるプログラ厶uccount.c( PAD psfile)を
実行し、結果を確かめよ。
さらに文字列中の小文字(a-z)の数を数えるプログラムを作成せよ。(解答)
8.4 文字列を比較(辞書式とは少し違う)するプログラムstrcmp.c( 擬似コード)
を実行し、結果を確かめよ。
8.5 文字列が数字だけからなると仮定し、「数字の数値」(コードではない)を
すべて加算するプログラム strsum.c(PAD psfile) に、
数値を代入し、結果を確かめよ。
(例えば文字列"1998"を与えた時には1+9+9+8 を計算し27を表示する)
数値でなく文字を入れるとどうなるか。
ヒント : '0'から '9'までは順にコードが並んでいるので文字(char)から
'0' を引くと「数値」になる。
8.6 文字列が数字だけからなると仮定し、その数字の列が10 進数として、
その数値を整数型変数 n に格納するプログラムstr2num.c(PAD psfile)に
数値を代入し、結果を確かめよ。
( scanf("%d",&n)の内部ではこのようなことが行なわれている )
◇一覧へ・上へ
○レポート課題8 (解答)
次の2つのプログラムを作成し、プログラムと実行結果を提出せよ。
また、アルゴリズムをPADで説明し、添付せよ。
8.1 文字列中の数字(0-9)の数を数えるプログラム
8.2 単語をアルファベットだけからなる文字列として、入力した文字列中の
単語数を数えるプログラム
ヒント : 文字列を順番にアルファベットかどうかを調べて、非アルファ
ベットからアルファベットに変化した回数をしらべればよい。
もっとヒント