第
第
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
>
を追加
文字型配列変数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)
コピー(代入)先の 文字型配列の先頭 要素のアドレスを指す ポインタ (=配列名)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に文字列bの 5文字分をコピー 文字列aはJapan Universityとなる 文字列を初期化すると、残りの要素に'¥0'が入る 中・上級 者向け
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
#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型)を返す.
int 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を返す.