< F2D837C E95CF CF68A4A94C5816A2E6A>

Similar documents
Taro-ファイル処理(公開版).jtd

Taro-リストⅠ(公開版).jtd

PowerPoint Presentation

Microsoft PowerPoint - 11.pptx

Microsoft Word - 3new.doc

Taro-ポインタ変数Ⅰ(公開版).j

Taro-リストⅢ(公開版).jtd

Taro-再帰関数Ⅲ(公開版).jtd

Microsoft PowerPoint - C言語の復習(配布用).ppt [互換モード]

Taro-再帰関数Ⅱ(公開版).jtd

Prog1_10th

Taro-スタック(公開版).jtd

ポインタ変数

Microsoft Word - no103.docx

コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol

gengo1-8

PowerPoint プレゼンテーション

Taro-プログラミングの基礎Ⅱ(公

Microsoft PowerPoint - 計算機言語 第7回.ppt

Microsoft PowerPoint - 5Chap15.ppt

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

PowerPoint プレゼンテーション

関数の動作 / printhw(); 7 printf(" n"); printhw(); printf("############ n"); 4 printhw(); 5 関数の作り方 ( 関数名 ) 戻り値 ( 後述 ) void である. 関数名 (

情報処理演習 B8クラス

Taro-最大値探索法の開発(公開版

Microsoft Word - no202.docx

Microsoft Word - Cプログラミング演習(12)

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

ファイル入出力

02: 変数と標準入出力

ファイル入出力

PowerPoint プレゼンテーション

gengo1-12

第1回 プログラミング演習3 センサーアプリケーション

PowerPoint プレゼンテーション

講習No.9

02: 変数と標準入出力

Taro-ビット処理(公開版).jtd

Microsoft PowerPoint - lec10.ppt

gengo1-12

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

Microsoft PowerPoint - CproNt02.ppt [互換モード]

Microsoft PowerPoint - kougi7.ppt

C言語7

講習No.12

2006年10月5日(木)実施

program7app.ppt

PowerPoint プレゼンテーション

プログラミング実習I

プログラミング及び演習 第1回 講義概容・実行制御

memo

02: 変数と標準入出力

プログラミング基礎

PowerPoint Presentation

kiso2-09.key

02: 変数と標準入出力

memo

Prog1_12th

Microsoft PowerPoint - 13th.ppt [互換モード]

Microsoft PowerPoint - 11.ppt [互換モード]

ポインタ変数

Taro-2分探索木Ⅱ(公開版).jtd

問 2 ( 型変換 ) 次のプログラムを実行しても正しい結果が得られない 何が間違いかを指摘し 正しく修正せよ ただし int サイズが 2 バイト long サイズが 4 バイトの処理系での演算を仮定する #include <stdio.h> int main( void ) { int a =

PowerPoint プレゼンテーション

Microsoft PowerPoint - prog04.ppt

gengo1-11

プログラミング実習I

Prog1_6th

プログラミング演習3 - Cプログラミング -

Microsoft PowerPoint - CproNt11.ppt [互換モード]

第2回講義:まとめ

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdiu.h> #define InFile "data.txt" #define OutFile "surted.txt" #def

Microsoft Word - Cプログラミング演習(9)

Microsoft Word - no11.docx

今までの復習 プログラムで最低限必要なもの 入力 ( キーボードから ファイルから ) 出力 ( 画面へ ファイルへ ) 条件分岐 : 条件の成立 不成立により 異なる動作をする 繰り返し : 一定の回数の繰返し 条件成立の間の繰返し 関数の定義 関数の呼び出し C ではそれ以外に ポインタ データ

Microsoft PowerPoint pptx

ポインタ変数

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1

memo

C言語入門

Microsoft PowerPoint - prog03.ppt

プログラミング演習3 - Cプログラミング -

gengo1-12

Microsoft Word - Cプログラミング演習(11)

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

8 / 0 1 i++ i 1 i-- i C !!! C 2

目次

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く

演習課題No12

プログラミングI第6回

CプログラミングI

講習No.8

Microsoft Word - Cプログラミング演習(1)_2012

Microsoft PowerPoint - kougi9.ppt

PowerPoint プレゼンテーション

Microsoft Word - report#8.docx

II ( ) prog8-1.c s1542h017%./prog8-1 1 => 35 Hiroshi 2 => 23 Koji 3 => 67 Satoshi 4 => 87 Junko 5 => 64 Ichiro 6 => 89 Mari 7 => 73 D

slide5.pptx

講習No.10

Transcription:

0. 目次 6. ポインタ変数と文字処理 6. 1 文字 6. 2 文字列定数 6. 3 文字列 6. 4 文字列配列 7. ポインタ変数と関数 8. 問題 7. 1 引数とポインタ変数 7. 1. 1 変数が引数の場合 7. 1. 2 ポインタ変数が引数の場合 7. 2 引数と配列 7. 3 戻り値とポインタ変数 問題 1 問題 2-1 -

6. ポインタ変数と文字処理 6. 1 文字 文字の宣言 char ch 文字の入力 scanf("%c",&ch) 文字とコード 文字はそのまま 8 ビットの数値 ( 文字コード ) と みなされる 文字定数 文字定数は ' で囲む プログラム ( ptr611.c) 1 /* << ptr611.c >> */ 2 #include <stdio.h> 3 int main() { 4 int i; 5 char ch; /* 文字の宣言 */ 6 scanf("%c",&ch); /* 文字の入力 */ 7 printf(" 文字 : %c \n",ch); 8 printf(" 文字コード : %d \n",ch); 9 ch = '0'; /* 文字定数 */ 10 printf(" 文字 : %c \n",ch); 11 printf(" 文字コード : %d \n",ch); 12 ch = '\0'; /* 文字定数 */ 13 printf(" 文字 : %c \n",ch); 14 printf(" 文字コード : %d \n",ch); 15 } % cc ptr611.c 1 文字 : 1 文字コード : 49 文字 : 0 文字コード : 48 文字 : 文字コード : 0-2 -

6. 2 文字列定数 文字列定数の宣言 char *p 文字列定数は アドレスで示されるのでポインタ変数 ( アドレスを格納するための変数 ) を使う ポインタ変数 pで指されたアドレスから順に文字が格納され 最後に文字コード 0の文字 ( '\0' で表す ) が格納される ヌル文字と呼ばれる 文字列定数の i 番目の文字は *(p+i) で取得する 文字列定数文字列定数は " で囲む "ab3" 文字列定数の入力代入文 p = "abc" p a b 3 \0 プログラム ( ptr621.c) 1 /* << ptr621.c >> */ 2 #include <stdio.h> 3 int main() { 4 int i; 5 char *p,*q; /* ポインタ変数の宣言 */ 6 7 /* 代入 */ 8 p = "ab3"; /* 文字列 ab3を記憶場所に保存しその先頭の 9 アドレスをポインタ変数 pに格納する */ 10 /* 文字列定数の出力 */ 11 printf(" 文字列定数 : %s \n",p); 12 printf("p+0:%x *(p+0): %c \n",p+0,*(p+0)); 13 printf("p+1:%x *(p+1): %c \n",p+1,*(p+1)); 14 printf("p+2:%x *(p+2): %c \n",p+2,*(p+2)); 15 printf("p+3:%x *(p+3): %c \n",p+3,*(p+3)); 16 printf("&p:%x \n",&p); 17 } - 3 -

% cc ptr621.c 文字列定数 : ab3 p+0:208d8 *(p+0): a p+1:208d9 *(p+1): b p+2:208da *(p+2): 3 p+3:208db *(p+3): &p:effffb60 記憶領域 208d8 a 208d9 b 208da 3 208db \0 effffb60 208d8 <-- ポインタ 変数 pの位置 処理手順 1 char *p でポインタ変数 pが確保される p 2 "ab3" で文字列 ab3が記憶場所に保存される a b 3 \0 3 p = "ab3" で文字列先頭のアドレスがポインタ変数 pに格納される p a b 3 \0-4 -

6. 3 文字列 文字列の宣言 文字列の入力 char p[7] 文字列は配列 pに格納される 配列名はポインタ変数である scanf("%s",p) 読み込んだ文字は 配列要素の p[0],p[1],p[2] の順に格納され 最後に文字コード 0の文字 ('\0' で表す ) が格納される したがって 配列の大きさは 読み込む文字列の長さ +1 以上でなければならない p a b c A B C \0 プログラム ( ptr631.c) 1 /* << ptr631.c >> */ 2 #include <stdio.h> 3 int main() { 4 int i; 5 char p[7]; /* 文字列の宣言 */ 6 scanf("%s",p); /* 文字列の入力 */ 7 /* 文字列の出力 */ 8 printf(" 文字列 : %s %s \n",p); /* 文字列の長さ分の桁に出力 */ 9 printf(" 文字列 : %8s %8s \n",p); /* 8 桁の中に右寄せで出力 */ 10 printf(" 文字列 : %-8s %-8s \n",p); /* 8 桁の中に左寄せで出力 */ 11 /* 1 文字ずつの処理 */ 12 for( i=0; i<7; i++ ) { 13 printf("p[%d] ",i); /* 配列要素 */ 14 printf(" %d ",p[i]); /* 10 進数 */ 15 printf(" %x ",p[i]); /* 16 進数 */ 16 printf(" %c ",p[i]); /* 文字 */ 17 printf("\n"); 18 } 19 } % cc ptr631.c abcabc 文字列 : abcabc 文字列 : abcabc 文字列 : abcabc p[0] 97 61 a p[1] 98 62 b p[2] 99 63 c p[3] 65 41 A p[4] 66 42 B p[5] 67 43 C p[6] 0 0-5 -

6. 4 文字列配列 文字列配列の宣 char *p[3] 言ポインタ変数が 3 個用意される 文字列の入力 代入文 p[0] = "abc" 読み込んだ文字は 記憶場所に保存され 最後に文字コード 0の文字 ('\0' で表す ) が格納される 先頭の番地が p[0] に格納される p[0] a \0 p[1] 1 2 \0 p[2] A B C \0 プログラム ( ptr641.c) 1 /* << ptr641.c >> */ 2 #include <stdio.h> 3 int main() { 4 int i,j; 5 char *p[3]; /* 文字列配列の宣言 */ 6 /* 文字型配列への代入 */ 7 p[0] = "a"; /* 文字列 aを記憶場所に保存しその先頭の 8 アドレスを p[0] に格納する */ 9 p[1] = "12"; 10 p[2] = "ABC"; 11 /* 文字列配列要素 */ 12 for( j=0; j<=2; j++ ) { 13 printf("%d 番目の文字列 : %s\n",j,p[j]); 14 i = 0; 15 while( 1 ) { 16 printf("p[%d]+%d:%x ",j,i,p[j]+i); /* 番地 */ 17 printf("*(p[%d]+%d): %c \n",j,i,*(p[j]+i)); /* 文字 */ 18 if( *(p[j]+i) == '\0' ) { break; } 19 i++; 20 } 21 } 22 printf("p:%x\n",p); 23 printf("&p:%x\n",&p); 24 for( j=0; j<=2; j++ ) { printf("&p[%d]:%x\n",j,&p[j]); } 25 } - 6 -

% cc ptr641.c 0 番目の文字列 : a p[0]+0:20a1c *(p[0]+0): a p[0]+1:20a1d *(p[0]+1): 1 番目の文字列 : 12 p[1]+0:20a1e *(p[1]+0): 1 p[1]+1:20a1f *(p[1]+1): 2 p[1]+2:20a20 *(p[1]+2): 2 番目の文字列 : ABC p[2]+0:20a21 *(p[2]+0): A p[2]+1:20a22 *(p[2]+1): B p[2]+2:20a23 *(p[2]+2): C p[2]+3:20a24 *(p[2]+3): p:effffb54 &p:effffb54 &p[0]:effffb54 &p[1]:effffb58 &p[2]:effffb5c 記憶領域 20a1c a 20a1d \0 20a1e 1 20a1f 2 20a20 \0 20a21 A 20a22 B 20a23 C 20a24 \0 effffb54 20a1c <-- 文字列配列 p の位置 effffb58 effffb5c 20a1e 20a21-7 -

処理手順 1 char *p[3] によって ポインタ変数を要素とする配列 pが確保される 要素数は 3 個 2 p[0] = "a" で文字列 aが記憶場所に保存され 先頭のアドレスが p[0] に格納される p[1],p[2] も同様 p[0] a \0 p[1] 1 2 \0 p[2] A B C \0 ポインタ変数の配列の応用例 ( 引数の取り込み ) プログラム ( ptr651.c) 1 /* << ptr651.c >> */ 2 #include <stdio.h> 3 int main (int argc, char *argv[]) { 4 int i; 5 printf("argc = %d\n",argc); 6 for( i=0; i<argc; i++ ) { 7 printf("argv[%d] = %s\n",i,argv[i]); 8 } 9 } % cc ptr651.c p1 p2 argc = 3 argv[0] =./a.out argv[1] = p1 argv[2] = p2-8 -

7. ポインタ変数と関数 7. 1 引数とポインタ変数 変数を引数とすると 値が関数側に渡され関数内での変更は呼び出した側には影響を与えない ポインタ変数を引数とすると 番地が関数側に渡されるので関数内での変更は呼び出した側に影響を与えることになる 7. 1. 1 変数が引数の場合 プログラム ( ptr711.c) /* << ptr711.c >> */ #include <stdio.h> int main () { int a,b; void func1(int x, int y); 1 a = 111; b = 222; printf("main: a=%d b=%d\n",a,b); 2 func1(a,b); printf("main: a=%d b=%d\n\n",a,b); } void func1(int x, int y) { 3 x = -x; y = -y; printf("func1: x=%d y=%d\n",x,y); } main: a=111 b=222 func1: x=-111 y=-222 main: a=111 b=222 動作 1 a = 111; b =222; a b 111 222 func1 側 - 9 -

2 func1(a,b); a b 111 222 func1 側 x y 111 222 3 x = -x; y = -y; a b 111 222 func1 側 x y -111-222 7. 1. 2 ポインタ変数が引数の場合 プログラム ( ptr712.c) /* << ptr712.c >> */ #include <stdio.h> int main () { int a,b; void func2(int *a, int *b); 1 a = 333; b = 444; printf("main: a=%d b=%d\n",a,b); 2 func2(&a,&b); printf("main: a=%d b=%d\n",a,b); } void func2(int *x, int *y) { 3 *x = -*x; *y = -*y; printf("func2: *x=%d *y=%d\n",*x,*y); } main: a=333 b=444 func2: *x=-333 *y=-444 main: a=-333 b=-444-10 -

動作 1 a = 333; b = 444; a b 333 444 func2 側 2 func2(&a,&b); a b 333 444 func2 側 x y 3 *x = -*x; *y = -*y; a b -333-444 func2 側 x y - 11 -

7. 2 引数と配列 配列を引数とすると 配列の先頭番地が関数側に渡される 関数内で別の配列が作成されていないことに注意 また 関数内での変更は呼び出した側に影響を与えることになる プログラム ( ptr721.c) /* << ptr721.c >> */ #include <stdio.h> int main () { int a[9]; void func3(int x[]); 1 a[0] = 555; a[1] = 666; printf("main: a[0]=%d a[1]=%d\n",a[0],a[1]); 2 func3(a); printf("main: a[0]=%d a[1]=%d\n\n",a[0],a[1]); } void func3(int x[]) { 3 x[0] = -x[0]; x[1] = -x[1]; printf("func3: x[0]=%d x[1]=%d\n",x[0],x[1]); } main: a[0]=555 a[1]=666 func3: x[0]=-555 x[1]=-666 main: a[0]=-555 a[1]=-666-12 -

動作 1 a[0] = 555; a[1] = 666; 555 666 a func3 側 2 func3(a); 555 666 a func3 側 x 3 x[0] = -x[0]; x[1] = -x[1]; -555-666 a func3 側 x - 13 -

7. 3 戻り値とポインタ変数 戻り値としてポインタを指定できる プログラム ( ptr731.c) 1 2 /* << ptr731.c >> */ #include <stdio.h> int main () { char *p; char *func(); /* 文字型へのポインタを返す関数 func */ p = func(); printf("main: p=%x\n",p); printf("main: %s\n",p); } char *func() { char *q; q = "abc"; printf("func: q=%x\n",q); return(q); } 動作 func: q=40064e main: p=40064e main: abc 1 char *p; p func 側 2 p = func(); p func 側 q a b c \0-14 -

8. 問題 問題 1 ( 1 ) 文字列定数の長さを出力するプログラムを作成せよ 1 /* << ptr811.c >> */ 2 #include <stdio.h> 3 int main () { 4 int i; 5 char *p; 6 p = "abcdefg"; 7 i = 0; 8 while( *(p+i)!= 1 ) { i++; }; 9 printf(" 文字列定数 %s の長さ : %d\n",p,i); 10 } % cc ptr811.c 文字列定数 abcdefg の長さ : 7 a b c d e f g \0 p ( 2 )1 つの文字列を読み込み 文字列の長さを出力するプログラムを作成せよ 1 /* << ptr812.c >> */ 2 #include <stdio.h> 3 int main () { 4 int i; 5 char s[100]; 6 scanf("%s",s); 7 i = 0; 8 while( s[i]!= 2 ) { i++; }; 9 printf(" 文字列 %s の長さ : %d\n",s,i); 10 } % cc ptr812.c 123abc 文字列 123abc の長さ : 6 1 2 3 a b c \0 s - 15 -

問題 2 文字列の分離 ( 1 ) 入力文字列をピリオドで分離するプログラムを完成せよ ただし 処理前と処理後で入力文字列は変わらない プログラム ( ptr821.c) 1 /* << ptr821.c >> */ 2 #include <stdio.h> 3 #include <string.h> 4 int main() { 5 int i,j,k, 6 len, /* 入力した文字列の長さ */ 7 m; /* 分離した文字列の個数 */ 8 char in[81], /* 入力用配列の宣言 */ 9 out[9][81], /* 出力用配列の宣言 */ 10 del; /* 分離文字 */ 11 12 /* 文字列の入力 */ 13 scanf("%s",in); 14 printf(" 処理前文字列 (in): %s \n",in); 15 del = '.'; 16 printf(" 分離文字 : %c \n",del); 17 18 /* 初期設定 */ 19 len = strlen(in); 20 j = 0; 21 m = 0; 22 23 /* 分離処理 */ 24 for( i=0; i<len; i++ ) { 25 if( in[i]!= del ) { 26 /* 文字 in[i] が分離文字でない場合 */ 27 out[m][j] = 3 ; 28 j = j + 1; 29 } else { 30 /* 文字 in[i] が分離文字である場合 */ 31 out[m][j] = 4 ; 32 j = 0; 33 m = m + 1; 34 } 35 } 36 37 /* 最後の文字がピリオドでない場合 ヌル文字を追加する */ 38 if( in[len-1]!= del ) { 39 out[m][j] = '\0'; 40 m = m + 1; 41 } 42 43 /* 分離された文字列の表示 */ 44 for( k=0; k<m; k++ ) { 45 printf(" 分離された文字列 (%d): %s \n",k,out[k]); 46 } 47 printf(" 処理後文字列 (in): %s \n",in); 48 } - 16 -

% cc ptr821.c a.bc 処理前文字列 (in): a.bc 分離文字 :. 分離された文字列 (0): a 分離された文字列 (1): bc 処理後文字列 (in): a.bc a.bc. 処理前文字列 (in): a.bc. 分離文字 :. 分離された文字列 (0): a 分離された文字列 (1): bc 処理後文字列 (in): a.bc..a.bc. 処理前文字列 (in):.a.b 分離文字 :. 分離された文字列 (0): 分離された文字列 (1): a 分離された文字列 (2): b 処理後文字列 (in):.a.b 処理前 0 1 2 3 4 5 6 7 8 80 配列 in a. b c. d e f \0 配列 out 0 1 2 3 80 0 1 2 8 処理後 0 1 2 3 4 5 6 7 8 80 配列 in a. b c. d e f \0 配列 out 0 1 2 3 80 0 a \0 1 b c \0 2 d e f \0 8-17 -

( 2 ) 入力文字列をピリオドで分離するプログラムを完成せよ ただし 処理後 入力文字列は変わる プログラム ( ptr822.c) 1 /* << ptr822.c >> */ 2 #include <stdio.h> 3 #include <string.h> 4 int main() { 5 int i,k, 6 len, /* 文字列の長さ */ 7 m; /* 分離した文字列の個数 */ 8 char in[81], /* 入力用配列の宣言 */ 9 *out[81], /* 出力用配列の宣言 */ 10 del; /* 分離文字 */ 11 12 /* 文字列の入力 */ 13 scanf("%s",in); 14 printf(" 処理前文字列 (in): %s \n",in); 15 del = '.'; 16 printf(" 分離文字 : %c \n",del); 17 18 /* 初期設定 */ 19 len = strlen(in); 20 m = 0; 21 out[0] = in; 22 23 /* 分離処理 */ 24 for( i=0; i<len; i++ ) { 25 if( in[i] == del ) { 26 in[i] = 5 ; 27 m = m + 1; 28 out[m] = 6 ; 29 } 30 } 31 32 /* 最後の文字がピリオドでない場合 ヌル文字を追加する */ 33 if( in[len-1]!= '\0' ) { 34 in[len] = '\0'; 35 m = m + 1; 36 } 37 38 /* 分離された文字列の表示 */ 39 for( k=0; k<m; k++ ) { 40 printf(" 分離された文字列 (%d): %s \n",k,out[k]); 41 } 42 printf(" 処理後文字列 (in): %s \n",in); 43 } - 18 -

% cc ptr822.c a.bc 処理前文字列 (in): a.bc 分離文字 :. 分離された文字列 (0): a 分離された文字列 (1): bc 処理後文字列 (in): a % a.out a.bc. 処理前文字列 (in): a.bc. 分離文字 :. 分離された文字列 (0): a 分離された文字列 (1): bc 処理後文字列 (in): a % a.out.a.bc. 処理前文字列 (in):.a.bc 分離文字 :. 分離された文字列 (0): 分離された文字列 (1): a 分離された文字列 (2): bc 処理後文字列 (in): 処理前 処理後 out[0] a in[0] out[0] a in[0] out[1]. in[1] out[1] \0 in[1] out[2] b in[2] out[2] b in[2] c in[3] c in[3]. in[4] \0 in[4] out[80] d in[5] out[80] d in[5] e in[6] e in[6] f in[7] f in[7] \0 in[8] \0 in[8] in[80] in[80] - 19 -