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

Slides:



Advertisements
Similar presentations
1 例題 ex3b ( 配列 ) 科学科プログラミング. 2 例題 : ex3b  以下の 3 つについて例題を進める ステップ 1 :配列 ステップ 2 :最小と最大 ステップ 3 :文字型の配列.
Advertisements

配列の宣言 配列要素の初期値 配列の上限 メモリ領域 多次元配列 配列の応用
情報処理演習C2 ファイル操作について (2).
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
データ構造とアルゴリズム 第10回 mallocとfree
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)
16.3 関数と構造体 構造体ポインタ 地底探査ゲーム
文字配列の課題1 解説 /* a */ #include <stdio.h> main( ) { int i;
プログラミング演習(2組) 第12回
12: コマンドライン引数 C プログラミング入門 総機1 (月1) Linux にログインし、以下の講義ページ を開いておくこと
第8回 プログラミングⅡ 第8回
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
精密工学科プログラミング基礎 第9回資料 (12/11 実施)
ファイル操作と文字列の利用.
関数 関数とスタック.
第3回 配列,構造体,ポインタ ~ データ構造について学ぶための基礎~
プログラミング演習 バージョン1 担当教員:綴木 馴.
プログラミング論 関数ポインタ と 応用(qsort)
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
関数と配列とポインタ 1次元配列 2次元配列 配列を使って結果を返す 演習問題
プログラミング応用 printfと変数.
プログラミング論 II 2008年10月30日 文字列
プログラミング 4 記憶の割り付け.
2005年度 データ構造とアルゴリズム 第3回 「C言語の復習:再帰的データ構造」
第10章 これはかなり大変な事項!! ~ポインタ~
プログラミング入門2 第8回 ポインタ 情報工学科 篠埜 功.
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
プログラミング入門2 第11回 情報工学科 篠埜 功.
前回の練習問題.
第13章 文字の取り扱い方 13.1 文字と文字型変数 13.2 文字列 13.3 文字型配列への文字列の代入
第13章 文字の取り扱い方 13.1 文字と文字型関数 13.2 文字列 13.3 文字型配列への文字列の代入
第7回 プログラミングⅡ 第7回
地域情報学 C言語プログラミング 第5回 ポインタ、関数、ファイル入出力 2017年11月17日
第11回 プログラミングⅡ 第11回
P n ポインタの基礎 5 q m 5 7 int* p; int 型の変数を指すポインタ int* q; int 型の変数を指すポインタ int n=5, m=7; int 型の変数 int array[3]; int* pArray[3]; p = &n; ポインタにアドレスを代入しているのでOK.
プログラミング基礎B 文字列の扱い.
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
精密工学科プログラミング基礎Ⅱ 第4回資料 今回の授業で習得してほしいこと: 文字列の扱い ファイル入出力の方法 コマンドライン引数の使い方
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
配列変数とポインタ 静的確保と動的確保 ポインタ配列 2次元配列 時間計測 第1回レポートの課題
メモリとメモリアドレス, ポインタ変数,関数へのポインタ渡し
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
C言語 はじめに 2016年 吉田研究室.
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
プログラミング基礎a 第6回 C言語によるプログラミング入門 配列と文字列(その2)
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
プログラミング入門2 第9回 ポインタ 情報工学科 篠埜 功.
文字列へのポインタの配列 static char *lines[MAXLINES]; lines[0] NULL
高度プログラミング演習 (09).
第13章 文字の取り扱い方 13.1 文字と文字型変数 13.2 文字列 13.3 文字型配列への文字列の代入
ネットワーク・プログラミング Cプログラミングの基礎.
プログラミング入門2 第5回 配列 for文 変数宣言 初期化
プログラミング論 文字列
プログラミング 4 文字列.
岩村雅一 知能情報工学演習I 第12回(後半第6回) 岩村雅一
2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」
プログラミング演習II 2004年11月 16日(第5回) 理学部数学科・木村巌.
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
プログラミング入門2 第5回 配列 変数宣言、初期化について
プログラミング演習I 補講用課題
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
12: コマンドライン引数 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
Presentation transcript:

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

今日のポイント strcpy、strcat、strlen、strchr などの使い方をマスターする 「普通はストリングコピー」 Cのキーワードの読み方に悩んだら下記サイトを参考(前回紹介とは別サイト) http://www.okakogi.go.jp/People/miwa/program/c_lang/c_furoku.html

15.1 文字列処理の基本 1.文字列は配列に格納 2.文字列の終わりは¥0 W 1000 i x[0] 1001 l 1002 x[1] ・ x[0] x[1] x[2] x[3] x[4] x[18] x[19] この2点が重要ポイント e ¥O プログラム例 15.1.1 〜 15.1.3 は授業ではパス. 文字列がわかって来たら、自分で見直すこと.

15.2 文字列処理用ライブラリ関数 15.2.1 文字列のコピーと連結 文字列処理関数を使用するときは ヘッダに string.h を追加 #include <string.h> を追加

15.2 文字列処理用ライブラリ関数 15.2.1 文字列のコピー 文字型の配列変数 a,b を宣言 (30 は特に意味なし。 十分なサイズにすれば良い) プログラム例 15.2.1 より抜粋 char a[30], b[30]; char c[30] = {"University"}; strcpy(&a[0], "Japan "); strcpy(&b[0], &c[0]); 文字型配列変数 c の初期値は "University" とする 文字列定数 "Japan" を配列 変数 a にコピー(=代入) 文字列 c を文字列 b に コピー(=代入) 後ろから前へ strcpy(string1, string2);

15.2 文字列処理用ライブラリ関数 15.2.1 文字列のコピー 後ろから前へ ほとんどのテキストで 下記のように記述 例 strcpy(d,s); strcpy(string1, string2); 文字型配列 string1 の 先頭アドレス(ポインタ) 文字型配列 string2 の 先頭アドレス(ポインタ) または“文字列定数” プログラム例 15.2.1 のように strcpy(&string1[0], &string2[0]); と書いても同じこと。この方が 先頭アドレス を指しているのが実感できるが、短い方がスマートなので、上のように書くことが多い。

15.2 文字列処理用ライブラリ関数 15.2.1 文字列のコピー プログラム例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); return 0; } 文字型配列変数 a, b を宣言 (30 は特に意味なし。 十分なサイズにすれば良い) 文字型配列変数 c の初期値は "University" とする(30 はなくて も適正サイズを確保してくれる) 文字列定数 "Japan" を 配列変数 a にコピー(=代入) 文字列 c を文字列 b にコピー (=代入)

15.2 文字列処理用ライブラリ関数 15.2.1 文字列のコピー 関数 strcpy は以下のように定義されている(p.146) char *strcpy(char *ptr1, char *ptr2); コピー(代入)先の 文字型配列の先頭 要素のアドレスを指す ポインタ (=配列名) コピー(代入)元の 文字型配列の先頭 要素のアドレスを指す ポインタ (=配列名) 関数だから戻り値がある。 strcpy の戻り値は ptr1 (ポインタ) = ptr1[0] のアドレス    = 文字列 ptr1

15.2 文字列処理用ライブラリ関数 15.2.1 文字列の連結 strcat(string1, string2); Catenate means "to connect in a series." 1の後ろに2をつなげる strcat(string1, string2);

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); return 0; } 1次元文字配列のときは{ }は省略可能 1の後ろに2をつなげる strcat(string1, string2); 文字列 a に文字列 b を連結 文字列 a は Japan University となる

15.2 文字列処理用ライブラリ関数 15.2.1 文字列の連結 関数 strcat は以下のように定義されている(p.146) char *strcat(char *ptr1, char *ptr2); 連結先(前半部)の 文字型配列の先頭 要素のアドレスを指す ポインタ (=配列名) 連結する(後半部の) 文字型配列の先頭 要素のアドレスを指す ポインタ (=配列名) 関数 だから 戻り値 がある。 strcat の 戻り値 は ptr1 (ポインタ) = ptr1[0] のアドレス    = 文字列 ptr1

15.2 文字列処理用ライブラリ関数 15.2.1 文字列の部分コピー 中・上級者向け 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("%s\n", strcpy(a, c)); printf("%s\n", strncpy(a, b, 5)); return 0; } 文字列を初期化すると、残りの要素に '\0' が入る 文字列 a に文字列 b の 5 文字分をコピー 文字列 a は "Japan University" となる

15.2 文字列処理用ライブラリ関数 15.2.1 文字列の部分コピー 中・上級者向け 15.2 文字列処理用ライブラリ関数 15.2.1 文字列の部分コピー 関数 strncpy は以下のように定義されている(p.184) char *strncpy(char *ptr1, char *ptr2, int n); コピー(代入)先の 文字型配列の先頭 要素のアドレスを指す ポインタ (=配列名) コピー(代入)元の 文字型配列の先頭 要素のアドレスを指す ポインタ (=配列名) コピー元からコピーする バイト数 文字列 a ( ptr1 が指す)に b ( ptr2 が指す)の n 文字分を上書き 関数 だから 戻り値 がある。 strncpy の 戻り値 は ptr1 (ポインタ) ⇔ ptr1[0] のアドレス)

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

15.2 文字列処理用ライブラリ関数 15.2.2 その他の関数 strcmp(a, b); 中・上級者向け 15.2 文字列処理用ライブラリ関数 15.2.2 その他の関数 文字列 a と b を比較し、a < b なら負、 等しいなら 0、 a > b なら正の整数値 ( int 型)を返す。 strcmp(a, b); 使い方の例: a - b と同じ符号 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); 辞書に載っている順 ≒ アルファベット順 出力結果: 辞書式順序は文字列 Goodbye が前です.

15.2 文字列処理用ライブラリ関数 15.2.2 その他の関数 strchr(a,'o'); 文字列 a の中の文字 o の位置の ポインタ(アドレス)を返す。 見つからなければ NULL を返す。 strchr(a,'o'); 文字は何でも良い。 探したい文字を指定する 見かけはポインタ 実体は数字のゼロ a_p 使い方の例: "Department of Computer Science" a_p = strchr(a_p, ' '); ポインタ a_p から始まる文字列から空白を見つけ、その位置にポインタをセット

空白の位置を探し、それが 0 でない間は以下を繰り返す 15.2 文字列処理用ライブラリ関数 15.2.2 その他の関数 プログラム例 15.2.5 : strlen、strchr の使い方の例 #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 でない間は以下を繰り返す 空白の数 + 1 = 単語数

(空白の先頭アドレス) - (文章の先頭アドレス) + 1 中・上級者向け 15.2 文字列処理用ライブラリ関数 15.2.2 その他の関数 プログラム例 15.2.5 改: strlen、strchr の使い方の例 #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; (空白の先頭アドレス) - (文章の先頭アドレス) + 1 で、何文字目かがわかる。

15.2 文字列処理用ライブラリ関数 15.2.2 その他の関数 関数 strlen、strcmp の定義(p.149) 中・上級者向け 15.2 文字列処理用ライブラリ関数 15.2.2 その他の関数 関数 strlen、strcmp の定義(p.149) int strlen(char *ptr1); 文字列の長さを 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) 中・上級者向け 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 を参考に、以下の動作をするプログラムを作成せよ 適当な長さの文字型配列変数 a, b, c, d を 宣言 日本語の文章1と文章2を適当に決め、おのおの a と b に代入 (例えば、"宇都宮大学 ", "情報工学科 " など) c に a を、d に b をおのおの コピー c に b を、d に a をおのおの 連結 a 〜 d をディスプレイに 表示 (表示書式は自分の好みで良い)

PAD main ヘッダファイルの取り込み 文字型配列a~dの宣言 文章1をaに代入 文章2をbに代入 cにaをコピー = dにbをコピー cにbを連結 dにaを連結 a~dを表示

スキルアップタイム 2 プログラム例 15.2.5 改 を作成・実行する プログラム例 15.2.4 改 を作成・実行する 配列 a[30] の初期化(= "")を省略するとどうなるか 配列 b[30] の 30 を省略するとどうなるか strncpy の第3引数の 5 を増減するとどうなるか 演習問題 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