Download presentation
Presentation is loading. Please wait.
1
プログラミング演習I 2003年6月25日(第10回) 木村巌
2
今日やること 入出力関数の勉強 標準入出力とのやりとり
3
知識編:ストリーム ストリーム(stream):物理的な機器(端末やテープデバイス)、ファイルなどによらず、読み書きできるものを抽象化したもの.C言語の概念
4
ストリーム テキスト(text)ストリームとバイナリ(binary)ストリームとがある テキストストリーム;複数の行からなる
バイナリストリーム;char型のデータ値の連続
5
あらかじめ用意されるストリーム Cプログラムが実行を開始するとき、事前に定義され、オープンされるテキストストリームが3つある
標準入力(standard input)、多くの場合、キーボード 標準出力(standard output)、多くの場合、ディスプレイ 標準エラー出力(standard error)、多くの場合、ディスプレイ
6
FILE構造体 厳密には、構造体であることがCの規格で定められているわけではない ストリームの制御情報を保持するデータ型.
stdio.hで定義されている
7
getchar()とputchar() int getchar(void); 標準入力から1文字読み込む
int putchar(int); 標準出力に1文字出力 教科書p.124 リスト7-1, 7-3. ただし、EOFの入力は、CTRL+D
8
gets()は使わないこと! 教科書にある、char *gets(char *)は使うべきではない!引数として与えるchar *が指す場所に、どのくらいのデータが書き込まれるか、正しく予測する方法はない gets()によるバッファオーバーフロー(buffer overflow)はセキュリティホールの古典的な例.いまどき誰も使いません.
9
1行入力 fgets() char *fgets(char *str, int size, FILE *stream);
streamが示すストリームから、高々size byteだけ読み込み、strに保存する 行末に改行文字があっても、そのまま(gets()は行末の改行文字を削除する) 標準入力からの読み込みは fgets (str, size, stdin); 教科書12.2(p.226)も参照.
10
fgets()を使った例 /* study-fgets.c */ #include <stdio.h>
#define MAXLEN 256 int main (void) { char *str[MAXLEN]; fgets (str, MAXLEN, stdin); /* strに読み込む */ puts (str); /* strを標準出力へ書き出す */ return 0; }
11
fgets()を使った例2 /* study-fgets2.c CTRL+Dまで入力を鸚鵡返しする */
#include <stdio.h> #define MAXLEN 256 int main (void) { char *str[MAXLEN]; while (fgets (str, MAXLEN, stdin) != NULL) puts (str); return 0; }
12
書式付入力 scanf()にも、状況に応じて、gets()同様、セキュリティ面でのリスクがある C FAQ12 stdioを参照
教科書p.134, リスト7-6のように、数値の読み取り程度ならばまだ心配ない 問題は、書式指定に%sを使って、文字列を読み取る場合(教科書p.143) 安全性を考慮した例を述べる
13
メモリからの書式付入力sscanf() const char *sscanf(const char *str, const char *format,…); たとえば、sscanf(str, “%d”, &n); で、charの配列strから1つのintを読み、nに保存する
14
書式付入力sscanf()の例 #include <stdio.h> #define MAXLEN 256
/* study-scanf.c */ int main (void) { int n; char str[MAXLEN]; fgets (str, MAXLEN, stdin); /*標準入力からMAXLEN読み取る */ sscanf (str, “%d”, &n); /* 読み取った文字列を、整数として読む */ printf ("input = %d\n", n); return 0; }
15
ループしてみる例 #include <stdio.h> #define MAXLEN 256
/* study-scanf2.c */ /* 入力された実数の総和を返す*/ int main (void) { double n, sum = 0.0; char str[MAXLEN]; while (fgets (str, MAXLEN, stdin) != NULL) { sscanf (str, "%lf", &n); printf ("input = %f\n", n); sum += n; } printf ("sum = %f\n", sum); return 0;
16
書式付出力printf() 教科書7.4参照.
17
まとめ 主に標準入出力への入出力を学んだ 標準入力からの読み込み:fgets() 文字列の書式付入力:sscanf()
標準出力への書式付出力:printf() gets()やscanf()の潜在的なセキュリティホールについて
18
補足 printf()はstdoutへ書き出す, scanf()はstdinから読み込む
fprintf()は最初の引数で指定するストリームへ書き出す、fscanf()は最初の引数で指定するストリームから読み込む sprintf()は最初の引数で指定するcharの配列へ書き出す、sscanf()は最初の引数で指定するcharの配列から読み込む
19
教科書で残っている範囲 テキストの内容でまだやってないのは、 次回はファイル入出力の予定です 文字列に関する箇所 ポインタ
標準ライブラリ関数の大半 ファイル入出力の大半 次回はファイル入出力の予定です
20
レポート課題 課題:スライド15枚目のstudy-scanf2.cを参考に、Ctrl+Dが押されるまで与えられた実数の、平均値を求めるプログラムを作成せよ. いつもどおり木村までメールで送ること.締め切りは7/1(火)一杯.質問なども適宜、随時受け付けます. 添付ではなく、メール本文に書いてくれたほうが助かります.
Similar presentations
© 2024 slidesplayer.net Inc.
All rights reserved.