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 行以内の入力は実際には機能しません。