我知道这个问题被问了一百次,我已经搜索了所有的可能性,但我想我不够熟练,不知道这个问题在哪里。我正在编写一个程序,我需要用数据填充结构(整数和字符串)。我第一次尝试它时跳过了除第一次之外的所有事情,但是我没有恐慌,因为我记得从课堂上我需要使用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,它们也会被跳过。我不知道从哪里开始。 (代码不完整,其余部分无关紧要)
答案 0 :(得分:0)
你可以定义一个新的getchar
#include <stdlib.h>
#include <stdio.h>
#define getchar(x) (scanf("%c", x))
int main ()
{
char x, y[10];
getchar(&x);
scanf("%s", y);
printf("got %s\n", y);
return 0;
}
更新:这可能是更好的方法
#include <stdlib.h>
#include <stdio.h>
void work_to_do()
{
#define getchar(x) (scanf("%c", x))
char x, y[10];
getchar(&x);
scanf("%s", y);
printf("got %s\n", y);
#undef getchar
}
int main ()
{
work_to_do();
return 0;
}
解决scanf换行无知和getchar(但仍然是scanf忽略空格)
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#define __getchar() (read(2, NULL, 1)) // 2 stands for standard error, we can make the user enter a character.
void work_to_do()
{
char y[10];
__getchar();
scanf("%s", y);
printf("got %s\n", y);
__getchar();
}
int main ()
{
work_to_do();
return 0;
}
答案 1 :(得分:0)
scanf
按照记录的方式工作。此外,scanf
只要其功能被理解就没有错。
我创建了一个代码副本并将其提取以突出显示您要执行的操作。你需要自己填写其余部分。
在此代码中,您需要输入一个数字并按Enter键。然后输入一个字符串并按回车等。注意。 fflush(stdout)
语句是每个K&amp; R标准C实现的一部分。 fflush
强制将缓冲区的内容输出到控制台。这种刷新可以实现合理的用户/计算机对话。
#include <stdio.h>
main()
{
char string[100];
int helper;
printf("Welk type? (Taak:1, Examen:2, Voordracht:3)\n");
fflush(stdout);
scanf("%d",&helper); //select an itemtype
if (helper < 1 || helper > 3)
{
printf("wrong value, please try again");
return 0;
}
printf("Vul een naam in:\n");
fflush(stdout);
scanf("%s", &string[0]);
printf("\n%s\n", string);
printf("Vul een vaknaam in: \n");
fflush(stdout);
scanf("%s", &string[0]);
printf("\n%s\n", string);
printf("Vul een starttijd in:\n");
fflush(stdout);
scanf("%s", &string[0]);
printf("\n%s\n", string);
printf("Vul een eindtijd in: \n");
fflush(stdout);
scanf("%s", &string[0]);
printf("\n%s\n", string);
}
此代码在Eclipse上运行,带有Microsoft C编译器。
另外,我要强调的是,如果您输入:1 AAA BBB CCC DDD并按Enter键,则scanf
将执行五次。在此示例中,代码将运行完成!
因此,您需要跟踪代码逻辑(在本例中为直线),以了解如何根据输入的数据调用scanfs。
希望这会有所帮助。请问是否有更多问题。