サイトマップ / C言語講座>出入り口>総目次>目次:入出力(2)>書式付き入力と書式指定子
[gets( )とscanf( )の問題点の解決]←このソース→[書式付き出力と書式指定子]
/* 今日は、書式付き入力で使用される書式指定子について詳しく学びます。書式付き入力を行う標準ライブラリ関数には次のものがあります。
scanf( ), fscanf( ), sscanf( )
書式付き入力で使われる書式指定子は次の形をしています。
%[フラグ][フィールドサイズ][引数サイズ] 変換文字
変換文字 | 変 換 結 果 |
s | 文字列(末尾にヌル文字:\0を追加) |
c | 文字(末尾にヌル文字を追加しない) |
d | 符号付き10進数 |
u | 符号なし10進数 |
o | 符号なし8進数 |
x | 符号なし16進数(0x が付いても正しく変換) |
X | 符号なし16進数(0X が付いても正しく変換) |
e、E、f、g、G:浮動小数点数
今日のソースプログラムでは、2度目に呼ばれたscanf( )の異常なふるまいを取り上げます。ソースプログラムの中にある、do { } while ( ); は初期条件に関係なく、必ず一度はループの中に入ります。( )の条件を満たす間ループを続けます。今日のソースプログラムでは0が入力されるとループから抜けます。
メインルーチンの中で、同じ内容のscanf( )が2度呼ばれています。キーボードから、英数字1文字とスペースとint型の整数を入力します。scanf( )はスペースを区切り文字と解釈して、二つの変数に正常に代入が行われます。従って、正常に表示されます。
2度目の呼び出しでは、標準入力に前の呼び出しの改行コードが残っていて、これが最初の変数に代入されてしまいます。期待通りに表示されません。これを回避するために、代入の抑制を行います。
ループの中のscanf( )の最初の書式指定子を見て下さい。"%*c"で、改行コードの代入が抑制され、捨てられます。そのため、前のscanf( )の影響を受けなくなります。ループの中では、scanf( )は正常に機能します。英文字1文字とスペースと0を入力するとループから抜けます。 */
#include <stdio.h> void main(void); void main(void) { char c; int n; printf( "英文字1文字とスペースと整数を入力して下さい\t"); scanf("%c%d", &c, &n); /* 最初の scanf ( ) は成功する */ /* 正常に表示される */ printf("\nあなたは %c と %d を入力しました。\n", c, n); printf("英文字1文字とスペースと整数を入力して下さい\t"); scanf("%c%d", &c, &n); /* %c にstdin に残っている改行コードが入る */ /* 表示がおかしい */ printf("\nあなたは %c と %d を入力しました。\n", c, n); do{ printf("英文字1文字とスペースと整数を入力して下さい\t"); scanf("%*c%c%d", &c, &n); /* %*c で改行コードが捨てられる */ /* 正常に表示される */ printf("\nあなたは %c と %d を入力しました。\n", c, n); } while (n != 0); /* n が0ならループから抜ける */ } |
[gets( )とscanf( )の問題点の解決]←このソース→[書式付き出力と書式指定子]
/* (C) 2000- YFプロ. All Rights Reserved. */ 提供:C言語講座−それ自体コンパイルできる教材を使った講座です−