第 15 章 文字列処理
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 PresentationTRANSCRIPT
第第 1515 章 文字列処理章 文字列処理
15.1 文字列処理の基本15.2 文字列処理用ライブラリ関数
strcpy 、 strcat 、 strlen 、 strchr などの使い方をマスターする
http://www.okakogi.go.jp/People/miwa/program/c_lang/c_furoku.html
「 strcpy はなんて読む?」「普通はストリングコピー」 Cのキーワードの読み方に悩んだら下記サイトを参考(前回紹介とは別サイト)
今日のポイント
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点が重要ポイント
15.2 文字列処理用ライブラリ関数15.2.1 文字列のコピーと連結
文字列処理関数を使用するときはヘッダに string.h を追加
#include <string.h> を追加
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 にコピー(=代入)
後ろから前へ
ほとんどのテキストで下記のように記述
例 strcpy(d,s);
文字型配列 string2 の先頭アドレス(ポインタ)または“文字列定数”
文字型配列 string1 の先頭アドレス(ポインタ)
15.2 文字列処理用ライブラリ関数15.2.1 文字列のコピー
strcpy(string1, string2);
後ろから前へ
strcpy(&string1[0], &string2[0]);
プログラム例 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;}
文字型配列変数 c の初期値は"University" とする( 30 はなくても適正サイズを確保してくれる)
15.2 文字列処理用ライブラリ関数15.2.1 文字列のコピー
文字型配列変数 a, b を宣言( 30 は特に意味なし。十分なサイズにすれば良い)
文字列 c を文字列 b にコピー(=代入)
プログラム例 15.2.1 をスマートに書くと → プログラム例 15.2.2
文字列定数 "Japan" を配列変数 a にコピー(=代入)
15.2 文字列処理用ライブラリ関数15.2.1 文字列のコピー
char *strcpy(char *ptr1, char *ptr2);
コピー(代入)元の文字型配列の先頭要素のアドレスを指すポインタ (=配列名)
関数だから戻り値がある。strcpy の戻り値は ptr1 ( ポインタ ) = ptr1[0] のアドレス
= 文字列 ptr1
関数 strcpy は以下のように定義されている (p.146)
コピー(代入)先の文字型配列の先頭要素のアドレスを指すポインタ (=配列名)
15.2 文字列処理用ライブラリ関数15.2.1 文字列の連結
Catenate 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] のアドレス
= 文字列 ptr1
関数 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 に文字列 b の5 文字分をコピー
文字列 a は "Japan University" となる
文字列を初期化すると、残りの要素に '\0' が入る
中・上級者向け
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 文字分を上書き
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
#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);
文字列 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)
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 を返す .
スキルアップタイム 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 をディスプレイに 表示
(表示書式は自分の好みで良い)
PAD
main
ヘッダファイルの取り込み
文章 1 を a に代入
文字型配列 a~d の宣言
文章 2 を b に代入
c に a をコピー
d に b をコピー
c に b を連結
d に a を連結
a 〜 d を表示
=
スキルアップタイム 2
1. プログラム例 15.2.5 改 を作成・実行する2. プログラム例 15.2.4 改 を作成・実行する
配列 a[30] の初期化 (= "") を省略するとどうなるか
配列 b[30] の 30 を省略するとどうなるか strncpy の第 3 引数の 5 を増減するとどうなる
か
3. 演習問題 15.1 1) 〜 3) を解く
本日のパズル次のプログラムは何を出力するか#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