2

コード内で複数のscanf()ステートメントが検出された場合、最初のscanf()ステートメントを除き、他のステートメントはすべてスキップされますscanf()。つまり、コードの実行時にそれらのステートメントの入力を求めるプロンプトは表示されません。

私はいくつかの提案を試しました。たとえば、flushall()あるサイトでの使用が提案されましたが、コンパイル エラーが発生します。

どんな助けでも大歓迎です。

[コードは回答として追加されました。]

4

6 に答える 6

3

scanf()の返り値をチェック!

man ページから: 「scanf は、割り当てられた入力項目の数を返します。一致に失敗した場合、これは提供された数よりも少ないか、0 になることさえあります。0 は、利用可能な入力があったにもかかわらず、変換が割り当てられなかったことを示します。通常、これは '%d' 変換のアルファベット文字などの無効な入力文字が原因です. ファイルの終わりなどの変換が発生する前に入力エラーが発生した場合、値 EOF が返されます. エラーまたは変換の開始後にファイルの終わりが発生した場合、正常に完了した変換の数が返されます。」

于 2008-09-17T07:18:49.083 に答える
2

コードと入力の例は、問題を引き起こす可能性のある状況がたくさんあるため、特定の問題を解決するための私たちの能力を確実に向上させます.

例 (すぐに思いつきます):

  • フォーマット文字列が入力ストリームの次の文字と一致しません。したがって、scanf は何も読み取っていません。
  • 標準入力入力バッファは、フルまたはリターンが検出された場合にのみフラッシュされます。
  • 1 行の入力からの入力は、複数の scanf ステートメントで使用される場合があります。後続の scanf ステートメントは、最後に中断したところから再開されます。したがって、プログラムはユーザー入力のために停止しません。
  • %s は scanf と printf
    printf で異なる動作をし、文字列全体を出力します。
    scanf 1つのスペースで区切られた単語を読み取ります
于 2008-09-18T16:00:17.310 に答える
0

これは、変換の問題のように聞こえます。%s変換が終了しないか、入力されない文字などを指定した可能性があります。次のことをお勧めします。次のようなものを試してください:int a = 0; int b = 0; scanf( "%d"、&a); scanf( "%d"、&b); printf( "a =%d、b =%d \ n"、a、b); これが機能する場合は、変換を増やして、問題の原因を確認してください。

于 2008-09-17T06:56:32.820 に答える
0

"scanf();" の前には常に "fflush(stdin);" を使用してください。u が標準入力ストリームをクリアしない限り、scanf ステートメントは std i/p に既に存在する値を読み取るためです。

于 2011-09-14T19:07:06.007 に答える
0

scanf() は、入力ストリームを不確定な状態にする可能性があるため、常に危険だと思っていました。

私は、他の (より安全な) コマンドを使用して文字列 (fgets など) を取り込み、sscanf を使用してそれを処理することを好みます。その後、いつでも文字列の先頭に戻って再起動できます。

于 2008-09-17T06:52:50.003 に答える
0

コードはシンプルです。

#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!?]
于 2010-05-07T08:27:31.847 に答える