◎第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 単語をアルファベットだけからなる文字列として、入力した文字列中の 単語数を数えるプログラム ヒント : 文字列を順番にアルファベットかどうかを調べて、非アルファ ベットからアルファベットに変化した回数をしらべればよい。 もっとヒント
一覧へ