0

私は一晩中デバッグしていました。コンソールが常に 2 番目のランナーの名前を尋ねるためにジャンプするのは非常に紛らわしいですが、最初のランナーの名前を入力するための変更はありません。

ここに私のmain.cのセグメントがあります

Trunner runners[10];
Trunner best;
int n,i;
const char* name = "give the name for runner ";
const char* time = "give the time for runner ";

printf("How many names you have?");
scanf("%d",&n);

for(i=0;i<n;i++){
    readTime(&runners[i],time);
}

for(i=0;i<n;i++){
    readName(&runners[i],name);     
}

ここに私のrunner.cがあります

void readName(Trunner *runner, const char *prompt){

    printf(prompt);
    fgets (runner->name,30,stdin);  

    //getchar();

}

そして、私が得たものは、ランナーの名前がコンマと同じ行にある必要があり、ご覧のとおり、最初のランナーの名前は空です。

How many names you have?3
give the time for runner 11:13
give the time for runner 14:14
give the time for runner 12:13
give the name for runner give the name for runner lily
give the name for runner lucy
the winner is:
, 11:13

, 11:13 0:0
lily
, 14:14 3:1
lucy
, 12:13 1:0
Press any key to continue . . .
4

2 に答える 2

1

の実行後、scanf改行文字が残ります。最初に fgets がそれを読み取るため、文字列は空のままです。これを回避する方法はいくつかありますが、最も簡単な方法は、scanf の後に 1 つの fgets を実行し、バッファに改行文字を読み込むことです。

もう1つの(そしておそらくより良い)オプションは、fflush(stdin);の後に呼び出すことscanfです。コンソールから読み取る場合(そうであるように)、入力バッファをフラッシュするので、これでうまくいきます。

于 2013-01-28T21:13:05.570 に答える
0

scanf と fgets の両方を使用しました。これらの 2 つの機能は、動作が少し異なります。個人的には、自分で見たように、バッファにゴミが残るため、scanfには触れません。\n (または改行文字) は、ほとんどすべての入力の後に残りますが、違いは、それが残っていて実行scanf("%d",&someVar)すると、/n は %d にキャストできないため、ほとんどスキップされないということですが、バッファに \n があり、 \n は文字なのでscanf("&c",&someVar)scanf("%s",someArray)押したときと同じようにバッファからプルします。

たとえば、 getchar() によってバッファリングされた \n 文字を取り除くことができることに注意してください。ただし、それが存在することがわかっている場合、またはプログラムがキーの押下を待機している場合に限られます。プログラムの安定性を維持したい場合は、決して fflush を使用しないでください。説明http://www.gidnetwork.com/b-57.html

readTime 関数を投稿しなかったため、正確な解決策を提供することはできませんが、すべての入力に対して fgets を使用してから、i=strtol(buffer,NULL,10)たとえば使用できる整数に変換することをお勧めします ( にあります<stdlib.h>)。strtol、strtod、strtok 関数について読むことをお勧めします。これは、fgets を使用したあらゆる種類の入力に必要なすべてであるためです。

于 2013-01-29T00:00:29.593 に答える