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

Microsoft PowerPoint - 5Chap15.ppt

N/A
N/A
Protected

Academic year: 2021

シェア "Microsoft PowerPoint - 5Chap15.ppt"

Copied!
6
0
0

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

全文

(1)

15章

15

文字列処理

文字列処理

15.1 文字列処理の基本

15.2 文字列処理用ライブラリ関数

strcpy

、str

cat

、str

len

、str

chr

などの使い方をマスターする

http://www.okakogi.go.jp/People/miwa/program/c_lang/c_furoku.html 「strcpyはなんて読むの?」 「普通はストリングコピー」 Cのキーワードの読み方に悩んだら下記サイトを参考(前回紹介とは別サイト)

今日のポイント

1.文字列は配列に格納

2.文字列の終わりは

¥0

15.1 文字列処理の基本

1000

1001

1002

e

¥O

W

i

l

l

i

x[0]

x[1]

x[2]

x[3]

x[4]

x[18]

x[19]

プログラム例

15.1.1

15.1.3

は授業ではパス. 文字列がわかって来たら、自分で見直して下さい.

この2点が重要ポイント

15.2 文字列処理用ライブラリ関数

15.2.1 文字列のコピーと連結

文字列処理関数を使用するときは

ヘッダに

string.h

を追加

#include <

string.h

>

を追加

(2)

文字型配列変数cの初期値は Universityとする

15.2 文字列処理用ライブラリ関数

15.2.1 文字列のコピー

char a[30], b[30];

char c[30] = {"

University

"};

strcpy

(&

a

[0], "

Japan

");

strcpy

(&

b

[0], &

c

[0]);

strcpy(

string1

,

string2

);

文字型の配列変数a,bを宣言 (30は特に意味なし。 十分なサイズにすれば良い) プログラム例

15.2.1

より抜粋 文字列Japanを配列変数aに コピー(=代入) 文字列cを文字列bに コピー (=代入) 後ろから前へ ほとんどのテキストで 下記のように記述 例

strcpy(

d

,

s

);

文字型配列 string2 の 先頭アドレス(ポインタ) または“文字列定数” 文字型配列 string1 の 先頭アドレス(ポインタ)

15.2 文字列処理用ライブラリ関数

15.2.1 文字列のコピー

strcpy(

string1

,

string2

);

後ろから前へ

strcpy(

&string1[0]

,

&string2[0]

);

プログラム例 15.2.1 のように と書いても同じこと。この方が 先頭アドレス を指しているのが実感 できるが、短い方がスマートなので、上のように書くことが多い。 文字型配列変数cの初期値は Universityとする(30はなくて も適正サイズを確保してくれる)

15.2 文字列処理用ライブラリ関数

15.2.1 文字列のコピー

#include <stdio.h> #include <string.h> int main(void) { char a[30], b[30]; char c[] = "University";

strcpy(a, "Japan "); printf("%s¥n", a); strcpy(b, c); printf("%s¥n", b); strcat(a, b); printf("%s¥n", a); return 0; } 文字型配列変数a, bを宣言 (30は特に意味なし。 十分なサイズにすれば良い) 文字列bに文字列cをコピー (=代入)

プログラム例15.2.1をスマートに書くと

プログラム例15.2.2

配列変数aに文字列Japanを コピー(=代入) 文字列aと文字列bを連結

15.2 文字列処理用ライブラリ関数

15.2.1 文字列のコピー

char *strcpy(char *ptr1, char *ptr2);

コピー(代入)元の 文字型配列の先頭 要素のアドレスを指す ポインタ (=配列名)

関数

だから

戻り値

がある。

strcpy

戻り値

ptr1

(ポインタ) ⇔

ptr1[0]

アドレス

z

関数

strcpy

は以下のように定義されている

(p.146)

コピー(代入)先の 文字型配列の先頭 要素のアドレスを指す ポインタ (=配列名)

(3)

15.2 文字列処理用ライブラリ関数

15.2.1 文字列の連結

Cat

enate means "to connect in a series."

strcat(string1, string2);

1の後ろに2をつなげる

15.2 文字列処理用ライブラリ関数

15.2.1 文字列の連結

プログラム例 15.2.2

#include <stdio.h> #include <string.h> int main(void) { char a[30], b[30]; char c[] = "University"; strcpy(a, "Japan "); printf("%s¥n", a); strcpy(b, c); printf("%s¥n", b); strcat(a, b); printf("%s¥n", a); return 0; }

strcat(string1, string2);

文字列a に文字列b を連結 1の後ろに2をつなげる 文字列aはJapan Universityとなる 1次元文字配列のときは{ }は省略可能

15.2 文字列処理用ライブラリ関数

15.2.1 文字列の連結

char *strcat(char *ptr1, char *ptr2);

連結する(後半部の) 文字型配列の先頭 要素のアドレスを指す ポインタ (=配列名)

関数

だから

戻り値

がある。

strcat

戻り値

ptr1

(ポインタ)

ptr1[0]

アドレス

z

関数

strcat

は以下のように定義されている

(p.146)

連結先(前半部)の 文字型配列の先頭 要素のアドレスを指す ポインタ (=配列名)

15.2 文字列処理用ライブラリ関数

15.2.1 文字列の部分コピー

プログラム例 15.2.4 改変

#include <stdio.h> #include <string.h> int main(void) { int i;

char a[30] = "", b[30] = "Japan"; char c[] = "Kyoto University";

for (i = 0; i < 30; i++) printf("%d ", a[i]); printf("¥n");

for (i = 0; i < 30; i++) printf("%d ", b[i]); printf("¥n");

printf("%s¥n", strcpy(a, c)); printf("%s¥n", strncpy(a, b, 5)); return 0; } 文字列aに文字列b5文字分をコピー 文字列aはJapan Universityとなる 文字列を初期化すると、残りの要素に'¥0'が入る 中・上級 者向け

(4)

15.2 文字列処理用ライブラリ関数

15.2.1 文字列の部分コピー

z

関数

strncpy

は以下のように定義されている

(p.184)

中・上級 者向け

char *strncpy(char *ptr1, char *ptr2, int n);

コピー(代入)元の 文字型配列の先頭 要素のアドレスを指す ポインタ (=配列名)

関数

だから

戻り値

がある。

strncpy

戻り値

ptr1

(ポインタ)

ptr1[0]

アドレス

コピー(代入)先の 文字型配列の先頭 要素のアドレスを指す ポインタ (=配列名) コピー元から コピーする バイト数

文字列

a

ptr1

が指す)に

b

ptr2

が指す)の

n

文字分を上書き

15.2 文字列処理用ライブラリ関数

15.2.2 その他の関数

strlen(a);

文字列 a の長さを整数値( int 型)で返す。

char a[] = "Hello, Goodbye"; int length;

length = strlen(a);

printf(“文章 %s は %d 個の文字から成ります.¥n”, a, length);

使い方の例:

出力結果: 文章 Hello, Goodbye は 14 個の文字から成ります.

char a[] = "Hello", b[] = "Goodbye"; int comp;

comp = strcmp(a, b);

if (comp < 0) printf("辞書式順序は文字列 %s が前です.¥n", a); if (comp == 0) printf("辞書式順序は等しいです.¥n", a);

if (comp > 0) printf("辞書式順序は文字列 %s が前です.¥n", b); 辞書に載っている順 ≒ アルファベット順

15.2 文字列処理用ライブラリ関数

15.2.2 その他の関数

strcmp(a, b);

文字列

a

b

を比較し、

a < b

なら負、

等しいなら

0

a > b

なら正の整数値

int

型)を返す。

使い方の例: 出力結果: 辞書式順序は文字列 Goodbye が前です. 中・上級 者向け

a - b

と同じ符号 文字は何でも良い。 探したい文字を指定する

15.2 文字列処理用ライブラリ関数

15.2.2 その他の関数

strchr(a,'o');

文字列

a

の中の文字

o

の位置の

ポインタ(アドレス)を返す。

見つからなければ

NULL

を返す。

使い方の例: 見かけはポインタ 実体は数字のゼロ

a_p = strchr(a_p, ' ');

ポインタ a_p から始まる文字列から空白を見つけ、その位置にポインタをセット

"Department of Computer Science" a_p

(5)

#include <stdio.h> #include <string.h>

int main(void) {

char a[] = "Department of Computer Science"; char *a_p = a;

int length, count;

length = strlen(a);

printf("文章 %s は %d 個の文字から成ります.¥n", a, length); count = 0;

while (a_p = strchr(a_p, ' ')) {

count++; a_p++; } count++; printf("また、文章に含まれる単語の数は %d 個です.¥n", count); return 0; } 空白の位置を探し、それが 0 でない間は以下を繰り返す

15.2 文字列処理用ライブラリ関数

15.2.2 その他の関数

プログラム例 15.2.5 : strlen、strchr の使い方の例 空白の数 + 1 = 単語数 #include <stdio.h> #include <string.h> int main(void) {

char a[] = "Department of Computer Science"; char *a_p = a;

int length, count, position; length = strlen(a);

printf("文章 %s は %d 個の文字から成ります.¥n", a, length); count = 0;

while (a_p = strchr(a_p, ' ')) {

position = a_p - a + 1;

printf("第 %d 番目の空白は %d 文字目です.¥n", count + 1, position);

count++; a_p++; } count++; printf("また、文章に含まれる単語の数は %d 個です.¥n", count); return 0; }

15.2 文字列処理用ライブラリ関数

15.2.2 その他の関数

プログラム例 15.2.5 改変: strlen、strchr の使い方の例 (空白の先頭アドレス) − (文章の先頭アドレス) + 1 で、何文字目かがわかる。 中・上級 者向け

15.2 文字列処理用ライブラリ関数

15.2.2 その他の関数

int strlen(char *ptr1);

関数

strlen

strcmp

の定義(p.149)

文字列の長さをint型で返す. 中・上級 者向け

int strcmp(char *ptr1, char *ptr2);

文字列aptr1が指す)と bptr2が指す)の辞書式順序を比較し、 a<bなら負、等しいなら0、a>bなら正の整数値(int型)を返す.

int strncpy(char *ptr1, char *ptr2, int n);

文字列aptr1が指す)にbptr2が指す)のn文字分を上書き.

(p.184)

15.2 文字列処理用ライブラリ関数

15.2.2 その他の関数

関数

strchr

strstr

の定義(pp.148〜149)

中・上級 者向け

char *strchr(char *ptr, char c);

文字列中から文字cを探し、指定文字の位置のポインタを返す. なければNULL を返す.

char *strstr(char *ptr1, char *ptr2);

文字列1 から文字列2 を探し、文字列2 の位置のポインタを返す. なければ NULLを返す.

(6)

スキルアップタイム 1

z

プログラム例 15.2.1〜15.2.4 を参考に、以下の動作

をするプログラムを作成せよ

1.

適当な長さの文字型配列変数

a, b, c, d

を 宣言

2.

日本語の文章1と文章2を適当に決め、おのおの

a

b

代入

(例えば、"宇都宮大学 ", "情報工学科 " など)

3.

c

a

を、

d

b

をおのおの

コピー

4.

c

b

を、

d

a

をおのおの

連結

5.

a 〜 d

をディスプレイに 表示

(表示書式は自分の好みで良い)

スキルアップタイム 2

1.

プログラム例

15.2.5 改変

を作成・実行する

2.

プログラム例

15.2.4 改変

を作成・実行する

z

配列

a[30]

初期化

(

= ""

)を省略するとどうなるか

z

配列

b[30]

30

を省略するとどうなるか

z

strncpy

第3引数

5

を増減するとどうなるか

3.

演習問題 15.1 1) 〜 3) を解く

参照

関連したドキュメント

[r]

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

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

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

備考 1.「処方」欄には、薬名、分量、用法及び用量を記載すること。

Photo Library キャンパスの夏 ひと 人 ひと 私たちの先生 文学部  米山直樹ゼミ SKY SEMINAR 文学部総合心理科学科教授・博士(心理学). 中島定彦