2

3つの異なる関数から入力を受け取る単純なプログラムがあります.2つはintを返し、1つはcharを返しますが、3番目の関数は何らかの理由でそのステップを完全にスキップします。

#include <stdio.h>

int get_height();
int get_length();
char get_symbol();
void draw_rectangle(int h, int l, char s);

int main () {

    int h, l;
    char s;

    h = get_height();
    l = get_length();
    s = get_symbol();

    draw_rectangle(h, l, s);

    return 0;
}

int get_height() {

    int i;

    printf ("Please enter the height of the rectangle: ");
    scanf ("%d", &i);

    return i;
}

int get_length() {

    int i;

    printf ("Please enter the length of the rectangle: ");
    scanf ("%d", &i);

    return i;
}

char get_symbol() {

    char i;

    printf ("Please enter the symbol for the rectangle: ");
    scanf ("%c", &i);

    return i;
}

void draw_rectangle(int h, int l, char s) {
    printf ("%d %d %c", h, l, s);
}

これを実行すると、高さと長さをスキャンできますが、文字をスキャンするプロンプトが出力されますが、ユーザー入力がスキップされ、h と l の値が出力されますが、s は出力されません。ここで何が欠けていますか?

4

3 に答える 3

3

前の scanf は入力バッファに改行を残します。これは次によって消費されます。

scanf ("%c", &i);

次のように変更するだけです。

scanf (" %c", &i);

スペースに注意してください。これにより、scanf はすべての空白を無視するようになります。

于 2012-12-11T19:56:21.470 に答える
2

scanf()以前の呼び出しによって残された改行文字を消費する必要があります。簡単な方法は次のとおりです。

scanf ("%d", &i);
getchar();

それが使用される各機能で。または、1 回の呼び出しで:

scanf(" %c", &i); 

スペースは、前のタブ、改行、またはスペースをスキップするように指示します。

stdinバッファリングされ、ユーザーが数字を入力すると、改行文字も取得されます。したがって、文字を取得する scanf は、残っている改行の1つを取得しています

于 2012-12-11T19:55:13.333 に答える
0

使用することもできます

fflush(stdin);
scanf("%c",&i);

それはあなたの問題を解決します。fflush は、文字を読み取る前にバッファをクリアします。

于 2012-12-12T15:53:07.563 に答える