【发布时间】:2013-08-04 02:41:35
【问题描述】:
我知道这个问题被问了一百遍,我已经搜索了所有的可能性,但我想我还不够熟练,无法知道这个问题出在哪里。我正在编写一个程序,我需要用数据(整数和字符串)填充结构。我第一次尝试它时,它跳过了除第一个之外的所有内容,但我没有惊慌,因为我记得在课堂上我需要使用fflush(stdin) 来克服这个问题。我搜索过的网站投票反对使用fflush(stdin),因为它具有未定义的行为。他们说使用getchar() 会吃掉额外的换行符,从而解决问题。因此我的代码:
int manNode(){
Item *p;
int helper;
p = (Item*)malloc(sizeof(Item));
printf("Welk type? (Taak:1, Examen:2, Voordracht:3)\n");
scanf("%u",&helper); //selecting an itemtype
if (helper < 1 || helper > 3)
{
printf("wrong value, please try again");
return 0;
}
getchar(); //I've just put getchars everywhere for safety.
p->entrytype = helper-1;
helper = 0;
printf("Vul een naam in:\n");
scanf("%s", p->name); //this one fills in fine
getchar();
printf("Vul een vaknaam in: \n");
scanf("%s", p->course); //this one gets skipped if I type more than one letter in the last scanf()
getchar();
printf("Vul een starttijd in:\n"); //From here on out everything gets skipped
p->start = getTijd();
checkTijd(p->start);
printf("Vul een eindtijd in: \n");
p->end = getTijd();
checkTijd(p->end);
我知道这有点混乱,但请关注 scanfs 和 getchars。 getTijd() 也有几个 scanfs 用于扫描整数,它们也会被跳过。我不知道从这里去哪里。 (代码并非不完整,其余无关紧要)
【问题讨论】:
-
你能展示一下
Item的结构吗? -
scanf大约是 C 语言中可用的最糟糕的解析工具,因为它尝试执行两项任务(读取输入并将其分成几部分),当这些部分不完全符合预期时,它会离开输入流处于难以确定的状态。fgets/sscanf使分工更加稳健。 -
每次使用时都必须检查
scanf()是否成功。当它出错时,它仍然是错误的。您应该错误检查getchar()函数。您还应该通过打印刚刚读取的值来进行调试,以确保您得到了您认为得到的结果。 -
请注意,
fflush(stdin)是在 Windows 上定义的,而不是在 Unix 平台上定义的。请研究如何创建 SSCCE (Short, Self-Contained, Correct Example)。此外,您应该真正展示一个运行程序时所做的示例,以便我们可以看到出了什么问题。 -
使用 fflush(stdout) 并按回车键强制标准输入缓冲区由 scanf 处理。请参阅下面的答案。
标签: c input stdin scanf fflush