-3
#include <stdio.h>

int main(){
    int l,m,q,j;
    char option;
    scanf("%d",&q);
    printf("%d\n",q);
    for(j=0;j<q;j++){
        scanf("%c %d %d",&option,&l,&m);
        printf("%c %d %d",option,l,m);
    }
    return 0;
}

出力:

3(Input)
3
C 1 4(Input)

 0 -374066224C 1 4

上記のコードの何が問題になっていますか? 期待される出力が得られません。

4

2 に答える 2

9

最初の (およびscanf()後続scanf()の s)からの入力ストリームにはまだ改行 文字があります。optionintCintlmint

スキップするには、ループscanf()内のフォーマット指定子に先頭のスペース文字を追加します。for

scanf(" %c %d %d",&option,&l,&m);
    /* ^ */

の戻り値scanf()は、成功した割り当ての数です。これをチェックして、割り当てが行われたことを確認してください3

if (3 == scanf(" %c %d %d",&option,&l,&m))
{
    /* Valid input. */
}
于 2012-08-10T13:22:01.940 に答える
2

ユーザーに入力を求めるたびに、ユーザーはそれを書き込んで Enter キーを押します。Enter は、入力バッファーに改行文字を残します。文字入力を要求する前に破棄する必要があります。破棄しないと、文字変数になります。

簡単だが率直な解決策は次のとおりです。

scanf("%d",&q); getchar();
printf("%d\n",q);
for(j=0;j<q;j++){
    scanf("%c %d %d",&option,&l,&m); getchar();
    printf("%c %d %d",option,l,m);
}

(これに関する C FAQ がどこかにあると確信していますが、リンクが見つかりません。)

于 2012-08-10T13:24:11.943 に答える