1

私はプログラミングが初めてで、クラスで課題に取り組んでいます。奇妙な理由で、プログラムは同じ行に2つの異なるprintfを出力し続け、情報を入力する機会を与えません

コードは次のとおりです。

#include <stdio.h>
#include <stdlib.h>

int main (void)
{   char Name[20];
    char cid1[6]="", cid2[6]="", cid3[6]="", cid4[6]="", cid5[6]="", cid6[6]="";
    char Description1[21]="", Description2[21]="", Description3[21]="", Description4[21]="", Description5[21]="", Description6[21]="";
int hrs1 = 0, hrs2=0, hrs3=0, hrs4=0, hrs5=0, hrs6=0;
char grade1[2]="",grade2[2]="",grade3[2]="",grade4[2]="",grade5[2]="",grade6[2]="";

printf("Enter Students Name ");
fgets(Name, 20, stdin);

printf("Enter Class ID ");
scanf("%5s", cid1);

printf("Enter Class Description ");             // Problem
fgets(Description1, 20, stdin);                 // here

printf("Enter Class Hours ");
scanf("%d", &hrs1);

printf("Enter Class Grade ");
fgets(grade1, 1, stdin);

printf("%s\n", Name);
printf("%s\n", cid1);
printf("%s\n", Description1);
printf("%d\n", hrs1);
printf("%s\n", grade1);

system("pause");

return 0;

「ここに問題があります」とマークされた領域は、現在問題が発生している場所です。クラスの説明を求める代わりに、クラスの時間の入力に直接スキップし、下部にあるクラスの成績の入力を完全に無視します。

それは次のように印刷されます: クラスの説明を入力してください。

4

4 に答える 4

0

scanf呼び出しで改行文字を消費しませんでした。fgets改行文字を読み取ると戻りますので、すぐに戻ります。

scanf次のように改行文字を使用するようにフォーマット文字列を変更できます

scanf("%5s\r\n", cid1);
于 2013-02-20T20:31:25.760 に答える
0

彼らはあなたに と の違いを教えようとしていscanfますfgets。クラス ID は 4 文字である必要があると言って、おそらくだまされているのでしょう。

したがって、クラス ID が「1234」で、ヒットした場合、最終的には次Enterのようになります。stdin

1234\r\n

%5s形式は、scanf5 文字を読み取ってから先に進むことを示しています。したがって、ストリームを読み込んで1234\r終了\nします。stdin次に、fgets実行時に を読み込み、先に\n進みます。

上記からfgets

ストリームから文字列を取得

stream から文字を読み取り、(num-1) 文字が読み取られるか、改行またはファイルの終わりに到達するまで、C 文字列として str に格納します。

于 2013-02-20T20:37:25.487 に答える
0

前の入力操作から、入力バッファーに改行が残っています。それを取り除く 1 つの方法は、'\n'.

于 2013-02-20T20:28:04.823 に答える
0

これをWindowsで実行しているようです。Windows には、stdin の適切なフラッシュに問題があります。を使用してみてください

 fflush(stdin);

コンソールからの読み取り後。

于 2013-02-20T20:32:41.743 に答える