文字列へのポインタの配列 static char *lines[MAXLINES]; lines[0] NULL

Slides:



Advertisements
Similar presentations
1 B10 CPU を作る 1 日目 解説 TA 高田正法
Advertisements

15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
情報処理演習C2 ファイル操作について (2).
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
プログラミング入門2 第10回 動的な領域確保 情報工学科 篠埜 功.
データ構造とアルゴリズム 第10回 mallocとfree
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
プログラミング基礎I(再) 山元進.
プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)
12: コマンドライン引数 C プログラミング入門 総機1 (月1) Linux にログインし、以下の講義ページ を開いておくこと
情報処理Ⅱ 2005年12月9日(金).
12: コマンドライン引数 C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページ を開いておくこと
第8回 プログラミングⅡ 第8回
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング システムプログラミング プロセス間通信(パイプ) 担当:青木義満
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
情報処理Ⅱ 第13回 2006年1月20日(金).
ファイル操作と文字列の利用.
第3回 配列,構造体,ポインタ ~ データ構造について学ぶための基礎~
補足説明.
プログラミング論 関数ポインタ と 応用(qsort)
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
プログラミング論 ファイル入出力
プログラミング論 II 2008年10月30日 文字列
プログラミング 4 記憶の割り付け.
2005年度 データ構造とアルゴリズム 第3回 「C言語の復習:再帰的データ構造」
第10章 これはかなり大変な事項!! ~ポインタ~
プログラミング入門2 第8回 ポインタ 情報工学科 篠埜 功.
プログラミング入門2 第11回 情報工学科 篠埜 功.
演習1の解答例の解説 2004年10月21日 海谷 治彦.
プログラミング入門2 第11回 情報工学科 篠埜 功.
第7回 プログラミングⅡ 第7回
地域情報学 C言語プログラミング 第5回 ポインタ、関数、ファイル入出力 2017年11月17日
プログラミング論 ファイル入出力
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.
09: ポインタ・文字列 C プログラミング入門 総機1 (月1) Linux にログインし、以下の講義ページ を開いておくこと
データ構造と アルゴリズム 第五回 知能情報学部 新田直也.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
データ構造とアルゴリズム 第11回 リスト構造(1)
プログラミング入門2 第9回 ポインタ 情報工学科 篠埜 功.
アルゴリズムとプログラミング (Algorithms and Programming)
11: 動的メモリ確保 C プログラミング入門 総機1 (月1) Linux にログインし、以下の講義ページ を開いておくこと
高度プログラミング演習 (09).
ポインタとポインタを用いた関数定義.
プログラミング論 ポインタ
09: ポインタ・文字列 C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページを開いておく こと
12: コマンドライン引数 C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページを開いておく こと
11: 動的メモリ確保 C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページを開いておく こと
ネットワーク・プログラミング Cプログラミングの基礎.
第5回 プログラミングⅡ 第5回
情報処理Ⅱ 2006年11月24日(金).
情報処理Ⅱ 第7回 2004年11月16日(火).
11: 動的メモリ確保 C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページ を開いておくこと
プログラミング 4 文字列.
11: 動的メモリ確保 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」
情報処理Ⅱ 2005年11月25日(金).
プログラミング演習II 2004年11月 16日(第5回) 理学部数学科・木村巌.
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
プログラミング演習II 2004年11月 2日(第3回) 理学部数学科・木村巌.
プログラミング入門2 第5回 配列 変数宣言、初期化について
情報処理Ⅱ 小テスト 2005年2月1日(火).
モバイルプログラミング第3回 Cプログラミングの基礎( 2 )
プログラミング演習II 2003年10月29日(第2,3回) 木村巌.
プログラミング 3 ポインタ(1).
12: コマンドライン引数 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
Presentation transcript:

文字列へのポインタの配列 static char *lines[MAXLINES]; lines[0] NULL 文字列へのポインタの配列  static char *lines[MAXLINES]; lines[0] NULL lines の各要素lines[0],lines[1],…の値は, 各要素が指す文字列領域の先頭アドレスである. つまり,ポインタとは,指し示すメモリ領域の 先頭アドレスを格納している. lines[1] lines[2] 静的確保の方が動的確保よりも速い. 文字列へのポインタ char* p; ポインタはアドレスを格納する変数. 文字列へのポインタpの中身(ポインタの中身)は pの指す文字列領域の先頭アドレス.

malloc 関数で確保したメモリ領域のアドレスを,ReadLines関数の引数 として渡された文字列へのポインタの配列に順に格納 int cnt: 初期値cnt=0からcnt++することで, lines[0],lines[1],lines[2]となる. lines[cnt]: 文字列へのポインタ. lines[cnt] = malloc(strlen(buf) + 1); static char buf[LINELENGH]: 標準入力(キーボード)から読み込んだ文字列が入る 領域. strlen(buf): bufの指す文字列の長さ.         引数に文字列へのポインタbufを取り,\0までの文字数を返す. malloc(strlen(buf)+1): 文字列の長さに合わせてメモリ領域を確保する.              ただし,C言語における文字列は,\0で終端する              必要があるため,(文字数+1)バイトのメモリ領域が必要. NULL lines[0] lines[1] lines[2] char buf[] = "strawberry"; strlen(buf)は10を返す.

文字列のコピー lines[cnt]: 文字列へのポインタ. buf: 標準入力(キーボード)から読み込んだ文字列へのポインタ. strcpy(lines[cnt], buf): 文字列のコピー.              第1引数にコピー先文字列領域へのポインタlines[cnt], 第2引数にコピー元文字列へのポインタbufを取り,              bufの指すコピー元文字列からlines[cnt]の指すコピー先 文字列領域にコピー. lines[0] strawberry\0 lines[1] watermelon\0 lines[2] ポインタを用いて文字列の中身を参照して,文字列の中身を¥0までをコピーする.

文字列のコピー lines[cnt]: 文字列へのポインタ. buf: 標準入力(キーボード)から読み込んだ文字列へのポインタ. strcpy(lines[cnt], buf): 文字列のコピー.              第1引数にコピー先文字列領域へのポインタlines[cnt], 第2引数にコピー元文字列へのポインタbufを取り,              bufの指すコピー元文字列からlines[cnt]の指すコピー先 文字列領域にコピー. lines[0] strawberry\0 cnt=2; buf lines[1] watermelon\0 banana\0 lines[2] banana\0 strcpy(lines[2],buf); ポインタを用いて文字列の中身を参照して,文字列の中身を¥0までをコピーする.

文字列の大小を比較(辞書順) const char *string1: 文字列string1のポインタ. int strcmp(const char *string1,const char *string2): 文字列の大小比較.         第1引数に文字列string1のポインタ,         第2引数に文字列string2のポインタを取り,             文字列string1, string2を辞書順に大小比較.         戻り値は,          string1>string2なら正の数, string1<string2なら負の数, string1=string2なら0である. char *string1 = "strawberry"; char *string2 = " watermelon"; strcmp(string1,string1)はstring1<string2なので負の数を返す.

Sort関数: 複数の文字列を辞書順にソート 文字列をソートするには,lines の各要素lines[0],lines[1],…の指している文字列どうしをstrcmp関数で比較して辞書順に整列するように,各要素の値,つまり,ポインタの中身を入れ替えればよい. banana\0 strawberry\0 lines[0] lines[1] lines[2] watermelon\0 Sort関数 ポインタが入れ替わり, lines[0],lines[1],…の 順で指している文字列が 辞書順に並ぶ. ポインタの指している文字列をstrcmp関数で比較して辞書順に整列するようにポインタの中身の入れ替えを行っているだけなので,文字列のメモリ上の位置は変わらない. つまり,linesの各要素の値である各文字列の先頭アドレスの入れ替えを行っているだけである.

Sort関数: 複数の文字列を辞書順にソート 文字列をソートするには,lines の各要素lines[0],lines[1],…の指している文字列どうしをstrcmp関数で比較して辞書順に整列するように,各要素の値,つまり,ポインタの中身を入れ替えればよい. void Sort(char *lines[], int num): 複数の文字列を辞書順にソート.                第1引数に文字列へのポインタの配列 lines ,     第2引数に行数(配列内の有効な値の数)numを取り,                戻り値はなし. banana\0 strawberry\0 lines[0] lines[1] lines[2] watermelon\0 Sort関数 ポインタが入れ替わり, lines[0],lines[1],…の 順で指している文字列が 辞書順に並ぶ. lines[num-1] 文字列へのポインタの配列を使うと、実際に文字列を動かさなくても並べ替えの働きを実現できる.また,文字列に限らずXXXへのポインタの配列を使うことで,同様にXXXを並べ替えることもできる.