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

計算機言語 II 第 2 回

N/A
N/A
Protected

Academic year: 2021

シェア "計算機言語 II 第 2 回"

Copied!
3
0
0

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

全文

(1)

計算機言語

II

2

http://www.math.u-ryukyu.ac.jp/~suga/gengo/2018-2/02.pdf

1

文字列

C

には文字列という型がありません

.

他の言語

(

例えば

Java)

では

,

文字列という型

(Java

の場合はクラス

)

が定義されているものも多くあります

.

最初に

C

が開発された際には

, Unix

のシステム記述言語として開発され

,

当時は

Ascii

文字の操作ができ ることが重要でした

. Unix

の開発動機が

(

米語の文章の

)

文書処理でしたので

, Ascii

文字に対する処理を効率 よくするシステムが要求されました

.

そのためのライブラリ関数が

,

標準ライブラリに多く実装されています

.

Ascii

文字の処理だけなら

,

これらのライブラリ関数を利用することにより

,

効率よくプログラムを書くことが

できます

.

現実の処理系の実装では

,

特別なバイト列に対するデータの操作が実装されています

.

教科書

, 9

,

11

章では

,

この

Ascii

文字に対する処理法だけが書かれています

.

現在では

, Ascii

文字以外の多くの文字があることを

,

ほとんどのプログラマは理解しています

.

それらの文

字列を操作する仕組みも

C

言語にいくらか取り入れられていますが

,

文字コードの規格の変遷があったため

,

Ascii

コードほど充実していませんしこれからも変更される可能性もあります

.

ここでも

, Ascii

コードの処理を中心に解説します

.

日本語文字列を操作するのなら

, Java

Python

のよ

うな

,

より近代的なプログラミング環境を利用するべき時代だと思います

.

1.1

文字列リテラル

C

,

ダブルクォート

(2

重引用符

) "

で囲まれる文字列は

,

「文字列リテラル」あるいは「文字列定数」と 呼ばれます

.

この値は

, ’\0’

で終わる

char

型の配列としてプログラム内に置かれます

. ’\0’

Ascii

コード の数値

0

に対応する文字コードで

, null character,

ヌル文字

(

ドイツ語風発音

),

あるいはナル文字

(

英語風発

)

と呼ばれるものです

.

すなわち

,

文字列の終了記号として

, ’\0’

を用いています

.

文字列操作をするライ ブラリ関数も

,

上の文字列の決め方を利用してプログラムが書かれています

.

従って

,

文字列リテラルでは

,

来の文字が消費するメモリ量に終端記号

’\0’

1

バイトが加わった値です

.

上のことを確かめるのが

, p. 240, List 9–1

です

.

このリストに文字列

"

あいう

"

のデータ量を表示する部分 を付け加えて

,

コンパイル

,

実行して見てください

.

文字列は

,

大きさが実行時に確定できないことが多くあります

. C

では

,

大きさを最初に確定するのではな

,

「実行時に必要なメモリを取ってきて文字列操作をすれば良い

(

メモリの動的確保

)

」という考え方で

,

語仕様を決めました

.

ただし

,

データの範囲

(

大きさ

)

が確定できないと

,

プログラムを書くことができません

.

そこで

,

終端記号を定義して

,

それを利用して大きさなどを測ることにしたのです

.

1

(2)

1.2

文字列変数

上に述べたように

,

文字列は

,

最後が

’\0’

である

char

型の配列として扱うことができます

(

というか

,

むし

char

型の配列としてしか扱えない

).

文字列を変数として

,

すなわち文字列の値を変化させるには

,

文字列 変数として

, char

型の配列変数を宣言します

.

配列型変数としての素朴な初期化

(

代入

)

,

教科書

p. 242, List 9–2

,

文字列の初期化に用意された

,

別な初期化方法が

, p. 243, List 9–3

です

. List 9–2

の形の代入による初期化では

, Ascii

文字しか文字列に入 力できません

. List 9–3

のやり方だと

, UTF-8

の漢字なども初期値として入力可能です

.

教科書

p. 243

の下の方にあるように

,

配列変数の代入はできません

.

文字列の

List 9–3

の初期化は

,

ある

種の例外となっています

.

List 9–2, List 9–3

をコンパイル実行してください

.

1.3

文字列の読み込み

printf, scanf

, %s

が文字列指定であることは

,

計算機概論での

awk

と同じです

. scanf

では

, UTF-8

の漢 字もきちんと文字列として読むことができます

. scanf

,

整数を読み込んだ時のような

&

が不要な理由は

,

インタ

(pointer)

を解説するときに述べます

.

List 9–4

をコンパイル

,

実行してください

.

これらの実行がうまくいくのは

, UTF-8

の設計がわりにうまくできていることと

,

皆さんが利用している端 末エミュレータが

UTF-8

をきちんと扱えるようにプログラムされているからです

.

1.4

文字列の操作

文字列の配列等は

,

ポインタを扱うときに集中して扱う方が理解しやすいので

,

ここでは飛ばします 最初に述べましたが

, (Ascii)

文字列を操作するライブラリ関数が

,

沢山の用意されています

. Linux

の環境 では

,

それらは次の

man

コマンドでわかります

.

残念ながら英語で表示されますが

,

この程度の英文は読める ようになってください

.

man string.h man ctype.h

この結果を読むと

,

どのような関数が定義されているかがわかります*1

.

あとは

,

その関数の元となった英語 が何かが問題なのです

.

例えば

,

教科書

p. 248

(Ascii)

文字列の長さを求める関数は

, strlen

として標準ライブラリにあります

.

従って

,

通常はをれを計算する関数を書くのではなく

, strlen

を利用します

. strlen

の使い方を知るには

, man 3 strlen

,

マニュアルを読むことができます

.

なお

,

ライブラリ関数

strlen

, List 9–4

とほぼ同じソースです

.

*1全て, Ascii文字列に対する操作です

2

(3)

List 9–8

は次のようにするのが正しい

C

でのプログラミングです

(

コメントは略

).

#include <stdio.h>

#include <string.h>

int main() {

char str[128];

printf("

文字列を入力してください

:");

scanf("%s", str);

printf("

文字列

\"%s\"

の長さは

%d

です

.\n", str, (int) strlen(str));

return 0;

}

このプログラムも

,

漢字を入力すると

UTF-8

が占めるバイト数が出力されます

.

1.5 toupper, tolower

教科書

p. 252

にアルファベットの大文字

,

小文字を交換するというプログラムが書かれています

.

ライブラ

リ関数を利用していますが

,

実装によっては

,

実は引数付きマクロ

(

講義では

,

解説が面倒なので省略した

)

呼ばれるものだったりします

. /usr/indluce/ctype.h

にこれは書かれています

.

これを実装するのはそれほど面倒なものではないので

,

ここでは

,

レポート問題にします

(

もちろん

,

普通 のプログラミングでは

,

わざわざ実装せずに

,

ライブラリ関数を使います

).

文字は

, Ascii

コードであるとし

,

Ascii

コードの決め方をうまく利用して書いて見てください

.

教科書

List 9–11

での関数

, str_toupper

str_tolower

の動作では

,

引数として受け取った値の中身を 変更しています

.

このような仕組みは

,

ポインタのところでもう一度取り上げます

.

教科書

List 9–11

は実際にコンパイル実行して見てください

.

漢字を入力しても問題ありませんが

,

全角の

英文字を入れても期待通りの動作はしません

.

「同じ文字に

2

つのコードを割り当てる」が邪悪であることを 実感してください

.

レポート問題

(

締め切り

: 10

18

(

))

文字列

"

あいう

"

のデータ量はいくつか

?

件名

:

あいう

.

教科書

p. 243,

演習

9–1.

件名

: Enshu 9–1.

関数

char toupper(char c)

を作成せよ

.

入力文字は

Ascii

コードであるとし

,

英小文字を英大文字に変

換する

.

ただし英大文字

,

数字

,

記号はそのままの値にする

.

件名

: toupper

3

参照

関連したドキュメント

 この論文の構成は次のようになっている。第2章では銅酸化物超伝導体に対する今までの研

明治33年8月,小学校令が改正され,それま で,国語科関係では,読書,作文,習字の三教

が作成したものである。ICDが病気や外傷を詳しく分類するものであるのに対し、ICFはそうした病 気等 の 状 態 に あ る人 の精 神機 能や 運動 機能 、歩 行や 家事 等の

Scival Topic Prominence

しかし私の理解と違うのは、寿岳章子が京都の「よろこび」を残さず読者に見せてくれる

本論文での分析は、叙述関係の Subject であれば、 Predicate に対して分配される ことが可能というものである。そして o

あれば、その逸脱に対しては N400 が惹起され、 ELAN や P600 は惹起しないと 考えられる。もし、シカの認可処理に統語的処理と意味的処理の両方が関わっ

自然言語というのは、生得 な文法 があるということです。 生まれつき に、人 に わっている 力を って乳幼児が獲得できる言語だという え です。 語の それ自 も、 から