• 検索結果がありません。

計算機言語 I 第 15 回 : 文字列

N/A
N/A
Protected

Academic year: 2021

シェア "計算機言語 I 第 15 回 : 文字列"

Copied!
3
0
0

読み込み中.... (全文を見る)

全文

(1)

計算機言語 I 15 : 文字列

この資料: http://www.math.u-ryukyu.ac.jp/~suga/gengo/2019-1/15.pdf

レポートへのツッコミ

特になし.

文字列

時間の都合で,この講義では「Ascii文字列」の扱いについてのみ解説します. アメリカ語以外の言語の扱い は面倒で, 文字コードに対する理解が必要です. ただし, 現在, PC の世界で標準的に利用されている文字コー

UTF-8では,文字列の長さ(文字数)に注意をすれば, Asciiとほぼ同じようにプログラムできます.

Cでは, 文字列はchar 型の配列で,文字列の終端を示す文字(終端文字, NULL文字,エスケープシーケン スで\0と記述する)が必ず最後についているものです. 文字列の扱う際には,このNULL文字を目印に文字 列の終了を判定してプログラムします. Cで利用される「配列とポインタの対応」を利用したプログラムが, 文字列を扱う処理では多く書かれます.

Cでは,ダブルクォート"で囲まれた文字の集まりは, 文字列定数(文字列リテラル)として,コンパイラは 認識します. (シングルクォートで囲めるのは, Ascii 1文字で,その意味はAsciiの文字コードの値にな . プログラム記述文字の集合がAscii以外処理系では,どういう扱いになるかは,知らない.)

すなわち, プログラムソース内で, "abcd" char型の配列で, ’a’, ’b’, ’c’, ’d’, ’\0’と最後に NULL文字をつけた大きさ5 の配列です.

教科書, プログラム11.2 はわかりづらいソースの典型例で, このようなプログラムを書いてはいけません ,実際上書くこともありません. (プログラム11.4のようなものを利用する.)

文字列入力

これまでのプログラムでは,文字列を標準入力から読み込むには,scanf("%s", ...)を利用してきました. しかし,scanf()は改行文字の扱いや,入力エラーが起きた時の処理が,実は面倒なことが知られています.

標準入力からの文字列の読み込み用のライブラリ関数として,gets()があるのですが,これもセキュリティ 上問題があることは,教科書に書かれている通りです.

文字列の読み込みは,教科書にあるように,ライブラリ関数fgets() を利用するのが通常の方法です. 注意 するのは,読み込む先には十分なメモリ(char型の配列)を必ず準備する必要があるところです.

1

(2)

文字列操作のライブラリ関数

文字列を扱うライブラリ関数が多く準備されており,

#include <string.h>

で利用できます. どのような関数があるかは,次でわかります. Bash-3.2$ man string.h

Ascii文字列だけを扱う限りでは,ここにあるライブラリ関数で,多くの文字列処理をすることができます.

このライブラリ関数の扱いで難しいのは, メモリ管理の部分です. 例えば,5文字分しかないchar配列に 10文字代入する」のような事が起こりがちで,コンパイルエラーにならず,実行時エラーになります.

文字列とポインタ, main() の引数

文字列とポインタの部分は,配列とポインタの関係をchar型配列に適用しただけです. 計算機概論I, CUIでのコマンドは次の形になると述べました.

Bash-3.2$ コマンド名 オプション1, ... , ファイル名またはディレクトリ名, ...

上で, コマンド名に続く「オプション1, ... ,ファイル名またはディレクトリ名, ...」はコマンドライン引数 と呼ばれます.

Cのプログラミングでは,main()の引数として,コマンドライン引数を受け取ることができます. 具体的に

,教科書p. 180の解説にある通りで,前回のべたポインタの配列が用いられています.

文字列と関数

この部分も,文字列はchar型配列である. 配列名は先頭部分を指すポインタであるということの応用です. これまでに述べたことですが,配列のコピーは時間がかかります. そこで, 文字列を扱う関数の多くは,ポイ ンタを利用した参照渡しをすることにより,配列のコピーはできる限りしないようなプログラムを書くのが, C でのプログラムの流儀です.

ファイルから文字列を読み込む,日本語

ファイルからの読み込みの部分も,基本的これまでのことの応用です.

上で述べたように,fgets()の方が改行文字の扱いがしやすいので,こちらを利用するのが普通です. 日本語については,文字コードの問題があり, 解説をするのは私の手に余ります.

2

(3)

Epilogue

この講義では,プログラミング言語Cの文法を中心とした講義をしました. Cの文法は概ね講義で述べてい ます. 改めて Cの特徴を述べておきます.

1. 構造化プログラミングのための手続き型言語である.

2. 言語仕様は,ライブラリ仕様とともに国際的な規格が存在し, ほとんどの処理系はそれに準拠する. ( だし,文法上曖昧な部分があり,その部分は,処理系依存となっている.)

3. 言語仕様は比較的小さく,多くの処理をライブラリが受け持つようにしている.

4. OS開発用言語として作られたため,ハードウェア制御の記述もでき,比較的,低水準言語である.

5. プログラムでのメモリ管理は,プログラマが面倒を見る必要があり,プログラマに高い能力を要求する.

6. CPUの特性をうまく利用して,実行速度の速いプログラムを書く事ができるようになっている.

7. Open Sourceと呼ばれる, ソースコードを公開して開発されるプログラム(例えばLinux)で多数利用

されており, Cのサンプルソースは,ネットに沢山ある.

講義では文法が中心で,それ以上に重要な, データ構造やアルゴリズムをほとんど述べる事ができませんで した. それらについては,後期の授業で少し講義します.

なお, 「わざわざプログラムはしないで今あるものを上手く利用する.」というのは, コンピュータを利用す る上での基本的な態度です.

しかし, 今あるものでは必要な処理を行ってもらえないという事も, 時に起こります. その時には, なんらか のプログラミング言語を用いてプログラムを組むという事も考える柔軟さは,持って下さい. その際には, C のような面倒な言語より,より使いやすい言語を利用する事も考えて下さい.

Cで勉強するメリットは,次の部分だと思います.

素朴なプログラミング環境なので,簡単なプログラムを書くには, あまり準備が要らない.

システムプログラムではCが使われる.

どのような処理をコンピュータは苦手とするかという事が,感覚的にわかる.

沢山のサンプルソースがネットにある.

計算機言語II

後期の計算機言語IIでは,次を参考書に,数値計算を中心としたプログラミングを講義する予定です.

C言語による数値計算入門,皆本晃弥著,サイエンス社

C言語によるアルゴリズム辞典,奥村晴彦著,技術評論社

特に,奥村さんの本は,様々なアルゴリズムの解説とサンプルソースがあり,良い本です.

レポート課題: 締め切り, 731() 23:59 (JST)

ftp://ftp.math.u-ryukyu.ac.jp/pub/enqueteにある授業評価アンケートの回答をメールせよ. 最後の授業なので, アンケートだけにします. 締め切りに注意してください. 件名: gengo2019-1 enquete

3

参照

関連したドキュメント

噸狂歌の本質に基く視点としては小それが短歌形式をとる韻文であることが第一であるP三十一文字(原則として音節と対応する)を基本としへ内部が五七・五七七という文字(音節)数を持つ定形詩である。そ

原稿は A4 判 (ヨコ約 210mm,タテ約 297mm) の 用紙を用い,プリンターまたはタイプライターによって印 字したものを原則とする.

管理画面へのログイン ID について 管理画面のログイン ID について、 希望の ID がある場合は備考欄にご記載下さい。アルファベット小文字、 数字お よび記号 「_ (アンダーライン)

奥付の記載が西暦の場合にも、一貫性を考えて、 []付きで元号を付した。また、奥付等の数

奥付の記載が西暦の場合にも、一貫性を考えて、 []付きで元号を付した。また、奥付等の数

古物営業法第5条第1項第6号に規定する文字・番号・記号 その他の符号(ホームページのURL)

名      称 図 記 号 文字記号

サンプル 入力列 A、B、C、D のいずれかに指定した値「東京」が含まれている場合、「含む判定」フラグに True を