サイトマップ / C言語講座出入り口総目次目次:入出力(2)>書式付き入力と書式指定子

青い直線

書式付き入力と書式指定子

青い直線

[gets( )とscanf( )の問題点の解決]←このソース→[書式付き出力と書式指定子]

/* 書式指定子の詳細説明 */

/* 今日は、書式付き入力で使用される書式指定子について詳しく学びます。書式付き入力を行う標準ライブラリ関数には次のものがあります。

    scanf(  ), fscanf(  ), sscanf(  )

書式付き入力で使われる書式指定子は次の形をしています。

%[フラグ][フィールドサイズ][引数サイズ] 変換文字

  1. %は次に書式指定子がくることをコンパイラに示します。
  2. [フラグ]は省略可能です。フラグに'*'を指定すると、代入を禁止します。使用例をソースプログラムに示します。
  3. フィールドサイズは入力される最大の文字数を数字で指定します。省略された場合は可能な限り変換します。
  4. 引数サイズはlong型、unsigned long型、および、double型の変換の時、'l'を付け、他の場合は付けません。
  5. 変換文字は省略できません。

変換文字の詳細説明

変換文字 変  換  結  果
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言語講座−それ自体コンパイルできる教材を使った講座です−

青い直線

サイトマップ / C言語講座出入り口総目次目次:入出力(2)>書式付き入力と書式指定子