0

我调试了一晚上,控制台老是跳着问我第二跑者的名字,却不给我输入第一跑者名字的零钱,这很迷惑。

这是我的 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 之后执行一次 fget,将换行符读取到缓冲区中。

另一个(可能更好)的选择是fflush(stdin);scanf. 如果从控制台读取(似乎是这种情况),这将在刷新输入缓冲区时起到作用。

于 2013-01-28T21:13:05.570 回答
0

您同时使用了 scanf 和 fgets。这两个功能的工作方式略有不同。就我个人而言,我不碰 scanf 是因为它在缓冲区中留下了垃圾,正如您亲眼所见。\n (或换行符)几乎在每次输入后都会保留,但不同的是,如果它被留下并且你这样做scanf("%d",&someVar),它通常不会跳过,因为 /n 不能转换为 %d 但是如果缓冲区中有 \n 并且你这样做scanf("&c",&someVar)scanf("%s",someArray)然后因为 \n 是一个字符,它会从缓冲区中拉出它,就像你刚刚按下它一样。

请注意,例如,您可以通过 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 回答