サイトマップ / C言語講座>出入り口>総目次>目次:入出力(2)>キーボードから1行入力
[getchar( )とputchar( )]←このソース→[gets( )とscanf( )の問題点の解決]
/* 今回は gets( ) について、少し詳しく説明します。
#include <stdio.h> char *gets(char *s); 例:gets(s);
gets( )は stdio.h をインクルードすれば使えるようになります。gets( )は標準入力(キーボード)から1行読み込み、s にしまいます。改行文字(\n)にあうと、s に NULL文字(\0)を追加して戻ります。 改行文字は捨てられます。
gets( )の使用例として、ソースプログラムでは文字列をしまう場所として、name[51] を宣言しています。追加される NULL 文字の分を含めて、英数字で51字を越えた場合、動作に異常が出る可能性があります。プログラムを実行させて、英数字で50字以上を入力してみて下さい。メモリー上で、他の変数の使っている領域にデータを上書きするかも知れません。最悪の場合バスエラーとなり暴走してしまいます。バスエラーは実行中のプログラムが、正常でないデータを参照した時などに起こることがあります。リセット以外に回復させる方法はありません。
重要:入力を抑制する方法がないので、gets( )の使用は慎重に。
今日のソースプログラムは、キーボードから名前と年齢体重を入力し、それを表示します。名前の入力にはgets( )を使います。ソースプログラムの終わりに近い部分に、printf( )が並んでいます。
printf("あなたの名前は%sです。\n", name); printf("あなたの年齢は%3d才です。\n", age); printf("あなたの体重は%4.1lf kg です。\n", weight);
'%'は次に書式指定子が来ることを示します。's'は書式指定子です。文字列を画面に出力します。'3d'は符号を含めて3桁の整数を表示します。'4.1lf'は少し複雑です。'lf'は浮動小数点数の形式で出力するという意味です。'4.1'は符号と小数点を含めて4文字の数を小数点以下1桁の精度で出力せよということです。
書式指定子については、ここより少し後の”書式付き入力と書式指定子”と”書式付き出力と書式指定子”で詳しく解説します。 */
#include <stdio.h> void main(void); void main(void) { char name[51]; /* 英数字で50 字分の文字列 */ int age; /* int 型の整数 */ double weight; /* double 型の浮動小数点数 */ printf("名前を入力して下さい\t"); gets(name); printf("年齢を入力して下さい\t"); scanf("%d", &age); /* & を付ける */ printf("体重 ( kg ) を入力して下さい\t"); scanf("%lf", &weight); /* & を付ける */ printf("\n\n"); /* 2行改行 */ printf("あなたの名前は%sです。\n", name); printf("あなたの年齢は%3d才です。\n", age); printf("あなたの体重は%4.1lf kg です。\n", weight); } |
/* もし、年齢を入力する際に、'18.5'のように浮動少数点数を入力したらどうなるでしょうか。ageは int型なので'18'がageに代入されます。そうすると標準入力に'.5'が残ります。'.5'は次の scanf( )でweightに代入されます。このため動作がおかしくなります。 */
[getchar( )とputchar( )]←このソース→[gets( )とscanf( )の問題点の解決]
/* (C) 2000- YFプロ. All Rights Reserved. */ 提供:C言語講座−それ自体コンパイルできる教材を使った講座です−