コード内で複数のscanf()
ステートメントが検出された場合、最初のscanf()
ステートメントを除き、他のステートメントはすべてスキップされますscanf()
。つまり、コードの実行時にそれらのステートメントの入力を求めるプロンプトは表示されません。
私はいくつかの提案を試しました。たとえば、flushall()
あるサイトでの使用が提案されましたが、コンパイル エラーが発生します。
どんな助けでも大歓迎です。
[コードは回答として追加されました。]
scanf()の返り値をチェック!
man ページから: 「scanf は、割り当てられた入力項目の数を返します。一致に失敗した場合、これは提供された数よりも少ないか、0 になることさえあります。0 は、利用可能な入力があったにもかかわらず、変換が割り当てられなかったことを示します。通常、これは '%d' 変換のアルファベット文字などの無効な入力文字が原因です. ファイルの終わりなどの変換が発生する前に入力エラーが発生した場合、値 EOF が返されます. エラーまたは変換の開始後にファイルの終わりが発生した場合、正常に完了した変換の数が返されます。」
コードと入力の例は、問題を引き起こす可能性のある状況がたくさんあるため、特定の問題を解決するための私たちの能力を確実に向上させます.
例 (すぐに思いつきます):
これは、変換の問題のように聞こえます。%s変換が終了しないか、入力されない文字などを指定した可能性があります。次のことをお勧めします。次のようなものを試してください:int a = 0; int b = 0; scanf( "%d"、&a); scanf( "%d"、&b); printf( "a =%d、b =%d \ n"、a、b); これが機能する場合は、変換を増やして、問題の原因を確認してください。
"scanf();" の前には常に "fflush(stdin);" を使用してください。u が標準入力ストリームをクリアしない限り、scanf ステートメントは std i/p に既に存在する値を読み取るためです。
scanf() は、入力ストリームを不確定な状態にする可能性があるため、常に危険だと思っていました。
私は、他の (より安全な) コマンドを使用して文字列 (fgets など) を取り込み、sscanf を使用してそれを処理することを好みます。その後、いつでも文字列の先頭に戻って再起動できます。
コードはシンプルです。
#include <stdio.h>
int main()
{
long int z,s,n,i,j,m,x;
scanf("%ld ",&z);
for(i=0; i<z; i++)
{
scanf("%ld",&s); n=0;
for (j=0; j<s; j++) { scanf("%ld",&m); n+=m; }
x=n+s-1;
printf("%ld\n",n);
}
return 0;
}
コンパイル:
D:\edycja>gcc WSEGA.c -o WSEGA.exe -Wall
D:\edycja>WSEGA.exe
D:\edycja> [Where was the program!?]