scanf入力の問題

scanf入力の問題

UVa の演習を作成するときに、scanf を使用して複数の文字を入力すると、次のように常に不可解な動作を停止することがわかりました。
このような
次に、いくつかの小さな実験を行ってください。

abcを入力してください

int main() 
{ 
    char ch1,ch2,ch3; 
    scanf("%c%c%c",&ch1,&ch2,&ch3); 
    printf("ch1=%c,ch2=%c,ch3=%c\n",ch1,ch2,ch3); 
    printf("ch1=%d,ch2=%d,ch3=%d\n",ch1,ch2,ch3); 
    0を返します。
}

abc を入力した結果は
次のとおりです。
ここに画像の説明を書きます
結果は明らかです。スペースは文字として ch2 に格納されます。
では、キャリッジ リターンはどうなるでしょうか?
ここに画像の説明を書きます
明らかに、キャリッジ リターンも文字として ch2 に格納されます。

注:
scanf(“%c%c%c”,&ch1,&ch2,&ch3);
および
scanf(“%c”,&ch1);
scanf(“%c”,&ch2);
scanf(“%c”,&ch3) ;
相当!

では、この問題をどうやって解決すればいいのでしょうか?


方法 1:

ctype.h ヘッダー ファイル内の isalpha( ) 関数を呼び出します。
この関数の機能は、文字が文字であるかどうかを判断して、不必要なスペースや復帰を回避できるようにすることです。

int main() 
{ 
    char ch1,ch2,ch3; 
    while( scanf("%c",&ch1) && !isalpha(ch1)); 
    while( scanf("%c",&ch2) && !isalpha(ch2)); 
    while( scanf("%c",&ch3) && !isalpha(ch3)); 
    printf("ch1=%c,ch2=%c,ch3=%c\n",ch1,ch2,ch3); 
    printf("ch1=%d,ch2=%d,ch3=%d\n",ch1,ch2,ch3); 
    0を返します。
}

「abc」も入力します。
ここに画像の説明を書きます
この時点では結果は正しいです。

方法 2:

scanfで入力するたびに「fflush(stdin);」を呼び出します。
この機能はファイル バッファをクリアすることですが、副作用として、すべての文字を 1 行に入力できず、別々の行に入力する必要があります。

int main() 
{ 
    char ch1,ch2,ch3; 
    fflush(標準入力); 
    scanf("%c",&ch1); 
    fflush(標準入力); 
    scanf("%c",&ch2); 
    fflush(標準入力); 
    scanf("%c",&ch3); 
    printf("ch1=%c,ch2=%c,ch3=%c\n",ch1,ch2,ch3); 
    printf("ch1=%d,ch2=%d,ch3=%d\n",ch1,ch2,ch3); 
    0を返します。
}

ここに画像の説明を書きます

下の図からわかるように、1 行以内の入力は実際には機能しません。
ここに画像の説明を書きます


この問題を解決する他の方法がある場合は、共有してください。

おすすめ

転載: blog.csdn.net/wings_zhang/article/details/78766114