第 15 章 文字列処理

24
15 15 第 第第第第第 第 第第第第第 15.1 文文文文文文文文 15.2 文文文文文文文文文文文文文

Upload: dahlia

Post on 13-Jan-2016

49 views

Category:

Documents


2 download

DESCRIPTION

第 15 章 文字列処理. 15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数. 今日のポイント. str cpy 、 str cat 、 str len 、 str chr などの使い方をマスターする. 「 strcpy はなんて読む?」 「普通は ストリングコピー 」 Cのキーワードの読み方に悩んだら下記サイトを参考(前回紹介とは別サイト). http://www.okakogi.go.jp/People/miwa/program/c_lang/c_furoku.html. x[0]. x[1]. x[2]. x[3]. x[4]. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 15 章 文字列処理

第第 1515 章 文字列処理章 文字列処理

15.1 文字列処理の基本15.2 文字列処理用ライブラリ関数

Page 2: 第 15 章 文字列処理

strcpy 、 strcat 、 strlen 、 strchr などの使い方をマスターする

http://www.okakogi.go.jp/People/miwa/program/c_lang/c_furoku.html

「 strcpy はなんて読む?」「普通はストリングコピー」 Cのキーワードの読み方に悩んだら下記サイトを参考(前回紹介とは別サイト)

今日のポイント

Page 3: 第 15 章 文字列処理

1.文字列は配列に格納2.文字列の終わりは ¥0

15.1 文字列処理の基本

100010011002

・・・

e¥O

Willi

x[0]x[1]x[2]x[3]x[4]

x[18]x[19]

プログラム例 15.1.1 〜 15.1.3 は授業ではパス .

文字列がわかって来たら、自分で見直すこと .

この2点が重要ポイント

Page 4: 第 15 章 文字列処理

15.2 文字列処理用ライブラリ関数15.2.1 文字列のコピーと連結

文字列処理関数を使用するときはヘッダに string.h を追加

#include <string.h> を追加

Page 5: 第 15 章 文字列処理

15.2 文字列処理用ライブラリ関数15.2.1 文字列のコピー

char a[30], b[30];char c[30] = {"University"};strcpy(&a[0], "Japan ");strcpy(&b[0], &c[0]);

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

strcpy(string1, string2);

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

文字列定数 "Japan" を配列変数 a にコピー(=代入)

文字列 c を文字列 b にコピー(=代入)

後ろから前へ

Page 6: 第 15 章 文字列処理

ほとんどのテキストで下記のように記述

例 strcpy(d,s);

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

文字型配列 string1 の先頭アドレス(ポインタ)

15.2 文字列処理用ライブラリ関数15.2.1 文字列のコピー

strcpy(string1, string2);

後ろから前へ

strcpy(&string1[0], &string2[0]);

プログラム例 15.2.1 のように

と書いても同じこと。この方が 先頭アドレス を指しているのが実感できるが、短い方がスマートなので、上のように書くことが多い。

Page 7: 第 15 章 文字列処理

#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;}

文字型配列変数 c の初期値は"University" とする( 30 はなくても適正サイズを確保してくれる)

15.2 文字列処理用ライブラリ関数15.2.1 文字列のコピー

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

文字列 c を文字列 b にコピー(=代入)

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

文字列定数 "Japan" を配列変数 a にコピー(=代入)

Page 8: 第 15 章 文字列処理

15.2 文字列処理用ライブラリ関数15.2.1 文字列のコピー

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

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

関数だから戻り値がある。strcpy の戻り値は ptr1 ( ポインタ ) = ptr1[0] のアドレス

   = 文字列 ptr1

関数 strcpy は以下のように定義されている (p.146)

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

Page 9: 第 15 章 文字列処理

15.2 文字列処理用ライブラリ関数15.2.1 文字列の連結

Catenate means "to connect in a series."

strcat(string1, string2);

1の後ろに2をつなげる

Page 10: 第 15 章 文字列処理

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 次元文字配列のときは{ }は省略可能

Page 11: 第 15 章 文字列処理

15.2 文字列処理用ライブラリ関数15.2.1 文字列の連結

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

連結する(後半部の)文字型配列の先頭

要素のアドレスを指すポインタ (=配列名)

関数 だから 戻り値 がある。strcat の 戻り値 は ptr1 ( ポインタ ) = ptr1[0] のアドレス

   = 文字列 ptr1

関数 strcat は以下のように定義されている (p.146)

連結先(前半部)の文字型配列の先頭

要素のアドレスを指すポインタ (=配列名)

Page 12: 第 15 章 文字列処理

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 に文字列 b の5 文字分をコピー

文字列 a は "Japan University" となる

文字列を初期化すると、残りの要素に '\0' が入る

中・上級者向け

Page 13: 第 15 章 文字列処理

15.2 文字列処理用ライブラリ関数15.2.1 文字列の部分コピー

関数 strncpy は以下のように定義されている (p.184)

中・上級者向け

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

コピー(代入)元の文字型配列の先頭

要素のアドレスを指すポインタ (=配列名)

関数 だから 戻り値 がある。strncpy の 戻り値 は ptr1 ( ポインタ ) ⇔ ptr1[0] のアドレス)

コピー(代入)先の文字型配列の先頭

要素のアドレスを指すポインタ (=配列名)

コピー元からコピーす

るバイト数

文字列 a ( ptr1 が指す)に b ( ptr2 が指す)の n 文字分を上書き

Page 14: 第 15 章 文字列処理

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 個の文字から成ります .

Page 15: 第 15 章 文字列処理

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と同じ符号

Page 16: 第 15 章 文字列処理

文字は何でも良い。探したい文字を指定する

15.2 文字列処理用ライブラリ関数15.2.2 その他の関数

strchr(a,'o'); 文字列 a の中の文字 o の位置のポインタ(アドレス)を返す。見つからなければ NULL を返す。

使い方の例:

見かけはポインタ実体は数字のゼロ

a_p = strchr(a_p, ' ');

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

"Department of Computer Science"

a_p

Page 17: 第 15 章 文字列処理

#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 = 単語数

Page 18: 第 15 章 文字列処理

#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で、何文字目かがわかる。

中・上級者向け

Page 19: 第 15 章 文字列処理

15.2 文字列処理用ライブラリ関数15.2.2 その他の関数

int strlen(char *ptr1);

関数 strlen 、 strcmp の定義( p.149 )

文字列の長さを int 型で返す .

中・上級者向け

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

文字列 a ( ptr1 が指す)と b ( ptr2 が指す)の辞書式順序を比較し、a < b なら負、等しいなら 0 、 a > b なら正の整数値( int 型)を返す .char *strncpy(char *ptr1, char *ptr2, int n);

文字列 a ( ptr1 が指す)に b ( ptr2 が指す)の n 文字分を上書き . (p.184)

Page 20: 第 15 章 文字列処理

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 を返す .

Page 21: 第 15 章 文字列処理

スキルアップタイム 1

プログラム例 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 をディスプレイに 表示

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

Page 22: 第 15 章 文字列処理

PAD

main

ヘッダファイルの取り込み

文章 1 を a に代入

文字型配列 a~d の宣言

文章 2 を b に代入

c に a をコピー

d に b をコピー

c に b を連結

d に a を連結

a 〜 d を表示

Page 23: 第 15 章 文字列処理

スキルアップタイム 2

1. プログラム例 15.2.5 改 を作成・実行する2. プログラム例 15.2.4 改 を作成・実行する

配列 a[30] の初期化 (= "") を省略するとどうなるか

配列 b[30] の 30 を省略するとどうなるか strncpy の第 3 引数の 5 を増減するとどうなる

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

Page 24: 第 15 章 文字列処理

本日のパズル次のプログラムは何を出力するか#include <stdio.h>#define PRINT(format,x) printf("%"#format"\n",x)int integer = 5;char character = '5';char *string   = "5";main(){

PRINT(d,string); PRINT(d,character); PRINT(d,integer);PRINT(s,string); PRINT(c,character); PRINT(c,integer=53);PRINT(d,( '5'>5 ));

}

1   2   3

4    5

6

7