ポインタ変数

Similar documents
データ構造

ポインタ変数

ポインタ変数

ポインタ変数

ポインタ変数

文字列 2 前回の授業ではコンピュータ内部での文字の取り扱い 文字型の変数 文字型変数への代入方法などを学習した 今回は 前回に引き続き 文字処理を学習する 内容は 標準入出力 ( キーボード ディスプレイ ) での文字処理 文字のファイル処理 文字を取り扱うライブラリ関数である 標準入出力 Lin

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

Microsoft Word - no103.docx

PowerPoint プレゼンテーション

情報処理演習 B8クラス

gengo1-12

ファイル入出力

Microsoft PowerPoint pptx

Microsoft Word - 3new.doc

ファイル入出力

gengo1-12

1. 入力した文字列を得る 1.1. 関数 scanf() を使う まずは関数 scanf() を使ったプログラムを作ってみましょう 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: #include<stdio.h> #define SIZE 128 main(

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

PowerPoint Presentation

練習&演習問題

ゲームエンジンの構成要素

データ構造

プログラミング基礎

gengo1-12

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

Prog1_10th

Microsoft PowerPoint - kougi6.ppt

PowerPoint プレゼンテーション

演算増幅器

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

V

PowerPoint Presentation

Microsoft PowerPoint - prog04.ppt

Microsoft Word - no15.docx

データ構造

PowerPoint プレゼンテーション

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

Microsoft PowerPoint - kougi11.ppt

< F2D837C E95CF CF68A4A94C5816A2E6A>

‚æ2›ñ C„¾„ê‡Ìš|

PowerPoint Presentation

Microsoft PowerPoint - 11.pptx

超初心者用

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

Prog1_12th

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

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

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

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

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

プログラミング実習I

Microsoft PowerPoint - 5Chap15.ppt

gengo1-6

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

Microsoft PowerPoint - C_Programming(3).pptx

2006年10月5日(木)実施

Microsoft Word - no202.docx

memo

初歩のC言語ターミナル_2014_May.pages

PowerPoint プレゼンテーション

02: 変数と標準入出力

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

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

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

プログラミング方法論 II 第 14,15 回 ( 担当 : 鈴木伸夫 ) 問題 17. x 座標と y 座標をメンバに持つ構造体 Point を作成せよ 但し座標 は double 型とする typedef struct{ (a) x; (b) y; } Point; 問題 18. 問題 17 の

C 言語第 3 回 2 a と b? 関係演算子 a と b の関係 関係演算子 等しい a==b 等しくない a!=b より大きい a>b 以上 a>=b より小さい a<b 以下 a<=b 状態 真偽 値 条件が満たされた場合 TRUE( 真 ) 1(0 以外 ) 条件が満たされなかった場合 F

02: 変数と標準入出力

講習No.9

データ構造

プログラミング実習I

02: 変数と標準入出力

基礎プログラミング2015

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

<4D F736F F D20438CBE8CEA8D758DC03389F0939A82C282AB2E646F63>

Microsoft PowerPoint - lec10.ppt

※ ポイント ※

slide4.pptx

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

Microsoft Word - no12.doc

Microsoft PowerPoint - 第3回目.ppt [互換モード]

Prog1_15th

Microsoft PowerPoint - 10Com2.ppt

* ライブラリ関数 islower(),toupper() を使ったプログラム 1 /* 2 Program : trupper.c 3 Student-ID : K 4 Author : TOUME, Kouta 5 Comments : Used Library function i

第2回講義:まとめ

スライド 1

Microsoft PowerPoint - kougi2.ppt

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

C言語講座 ~ファイル入出力編~

Cプログラミング1(再) 第2回

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

Microsoft Word - no204.docx

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

書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf

講習No.1

計算機プログラミング

memo

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

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

Transcription:

プログラミング及び実習 7 馬青 1

文字列処理 文字列 文字列は " ( ダブルクォーテーション ) で囲んで表現される 文字列というデータ型が存在しないので 文字列は文字の配列 あるいはポインタ変数として扱われる また 文字の配列あるいはポインタ変数を宣言するときのデータ型は char を用いる 従って char s[]="ryukoku Uni."; あるいは char *s="ryukoku Uni."; で文字の配列宣言をしておくと 配列 s に実際の文字列を初期値として与えることになる 2

文字列 この配列は計算機上実際に以下のように表現される s[0] s[1] s[2] s[3] s[4] s[5] s[6] s[7] s[8] s[9] s[10] s[11] s[12] R y u k o k u U n i. 0 つまり 文字列を上記のように宣言し 実際の値を付与すると 1 文字ごとに配列に格納され最後にヌル文字 0 が自動的に付加される 3

文字列 一般的には 他の変数と同様 文字列を宣言するとき 初期値を与えない場合が多い char s[64]; 文字配列 数字 64 は配列の大きさだが 最後に必ずヌル文字 0 を入れないといけないので 格納できる半角文字の最大個数は 64-1=63 になる 4

参考 ポインタ変数で宣言の場合 の注意点 1 以下は char *s1= Ryukoku, s2[]= Uni. ; strcat(s1, s2); 2 以下は char s1[64]= Ryukoku, s2[]= Uni. ; // *s2= Uni. ; も OK strcat(s1, s2); 3メイン関数でchar *s; で宣言するなら malloc 関数でメモリを確保して使う あるいは 他の文字列変数を指し示すのに使う ( 例えば char *s1, s2[64]; s1=s2;) これらの場合 連結などの文字列操作はOK 4 関数側の引数としてはchar *sをよく使う 5

文字列の付与方法 (1/4) 文字ごとに付与 s[0]= R ; or getchar() を用いる s[1]= y ; s[7]= ; s[12]= 0 ; i=0; while((s[i]=getchar())!= EOF){ if(s[i]== n ){ s[i]= 0 ; i=0;} //reset else i++; } 6

文字列の付与方法 (2/4) 文字列を丸ごとに読み込む #define N 5 char line[n]; fgets(line, sizeof(line), stdin); できれば大きめの数字 (256 など ) 改行までか最大 N-1 個の文字を読み込むことができる 123 を入力した場合 line[0]= 1, line[1]= 2, line[2]= 3, line[3]= n, line[4]= 0 123456 を入力した場合 line[0]= 1, line[1]= 2, line[2]= 3, line[3]= 4, line[4]= 0 になる 7

文字列の付与方法 (3/4) char s[64]; scanf( %s, s); で文字列を読み込むこともできる ただし たとえば ab cd という一行を入力する場合 fgets(s, sizeof(s), stdin) なら s に ab cd n がそのまま入る つまり 空白や改行記号まで読み込む scanf( %s, s) なら s に ab のみが入る すなわち s[0]= a, s[1]= b, s[2]= 0 scanf の高度な使い方では ab cd を読み込むこともできる 8

scanf() getchar() fgets() の併用について scanf() getchar() fgets() の併用は要注意 scanf(), getchar() は改行記号を読まずにバッファに残すので 次に getchar() や fgets() を使うと まずその改行記号を読み込んでしまう 9

scanf() getchar() fgets() の併用について #include <stdio.h> int main(void) { char s[64]; int ch; ch=getchar(); getchar(); fgets(s, 64, stdin); puts(s); return 0; } これがなければ fgets は n を読み込んで終わり つまり fgets で文字列の入力を待たずに puts が実行されてしまう 10

文字列の付与方法 (4/4) strcpy(s, Ryukoku Uni. ); のような文字列処理の関数を用いる ( 後で紹介する ) 注意 : char s[64]; s= Ryukoku Uni. ; はだめ! char *s; s= Ryukoku Univ. ; は OK 11

文字列の出力方法 puts(s); // ヌル文字 0 を改行に置き換える 123 をfgetsで読み込んだ場合 puts(s) を実行すれば 123 空行 が出力される 一方 printf( %s, s); は文字列を余分な改行をせず出力する ( 上記例では 改行は1 回するのみ したがって空行なし ) 当たり前だけど printf(s); という書き方もある 12

演習問題 1 下記のプログラムの出力を 改行や空白の有無も含め 示しなさい #include <stdio.h> int main(void) { char line[128]; fgets(line, sizeof(line), stdin); // Ryukoku Univ. を入力 puts(line); scanf( %s, line); // Ryukoku Univ. を入力 printf( %s, line); puts(line); return 0; } 13

例 : ファイルの複写プログラム #include <stdio.h> #define N 16 N を大きく設定する必要は? int main(void) { char line[n]; EOF またはエラー while(fgets(line, sizeof(line), stdin)!= NULL) printf( %s, line); return 0; } puts を使わない ( なぜ?) 14

OR 例 : ファイルの複写プログラム #include <stdio.h> #define N 16 int main(void) { char line[n]; int i; while(fgets(line, sizeof(line), stdin)!= NULL){ for(i=0; line[i]!= ' 0'; i++) putchar(line[i]);} return 0; } 15

実行結果./a.out Ryukoku University Ryukoku University Shiga-ken Otsu-shi Shiga-ken Otsu-shi Ctrl-Dで終了 cat input.dat This is a test! リダイレクション That is OK!!./a.out<input.dat>output.dat cat output.dat This is a test! That is OK!! 16

Question fgets() の代わりに getchar() を使う場合のプログラムは? 17

演習問題 2 fgets を用いて文字列変数 s1 に文字列を読み込み それを文字列変数 s2 にコピーするプログラムを作成しなさい ただし strcpy() のような文字列をコピーする標準関数は使わないとする 18

演習問題 3 fgets を用いて文字列変数 s1 に文字列を読み込み 英文字数字以外の文字を取り除いて文字列変数 s2 にコピーし その s2 を出力するプログラムを作成しなさい 実行例 :./a.out a1%b2@c3 a1b2c3 19

第 7 回実習課題 (1/3) 1.fgets で文字列を読み込み 文字間に記号 + を挿入して出力するプログラム (ex07-add.c) を作成しなさい 実行例 $./a.out abcdefg 入力 a+b+c+d+e+f+g 出力 123456 入力 1+2+3+4+5+6 出力 Ctrl-D 入力 終了 20

第 7 回実習課題 (2/3) 2.fgets で文字列を読み込み 文字数を求めるとともに文字列の逆順出力をするプログラム (ex07-rev.c) を作成しなさい 実行例 $./a.out abcdefg gfedcba(7) ytisrevinu ukokuyr Ryukoku University(18) Ctrl-D 終了 入力 出力 入力 出力 入力 21

第 7 回実習課題 (3/3) 3.2つの変数に2つの文字列をキーボード入力し それらを新しい文字列変数に繋げて格納し 新しい文字列の中身を (1つ1つの文字で出力ではなく) 文字列として一括出力するプログラム (ex07-strcat.c) を作成しなさい 実行例 $./a.out Ryukoku 入力 University 入力 RyukokuUniversity 出力終了なお 余裕があれば プログラムをCtrl-Dが押されるまで繰り返し処理できるように改良してみること 22