C scanf语法帮助

C scanf语法帮助,c,syntax,C,Syntax,当我运行下面的代码段时,它一直运行到第二个问题。然后,它将“客户是学生吗?(y/n)\n”和“电影放映时间是多少?(以小时为单位)\n”提示放在一起(它们之间没有回答的区域)。如果从那时起采取任何行动,程序将停止工作。我做错了什么?(我很确定它与语法有关) 您可能需要在每次scanf之后吃掉stdin的额外输入,这样它就不会停留在缓冲区中,导致scanf接收缓冲数据 这是因为在第一个文本条目之后按enter键的换行符保留在缓冲区中,并且是“%c”格式的有效条目-如果查看“edu”的值,您应该会发

当我运行下面的代码段时,它一直运行到第二个问题。然后,它将“客户是学生吗?(y/n)\n”和“电影放映时间是多少?(以小时为单位)\n”提示放在一起(它们之间没有回答的区域)。如果从那时起采取任何行动,程序将停止工作。我做错了什么?(我很确定它与语法有关)


您可能需要在每次scanf之后吃掉stdin的额外输入,这样它就不会停留在缓冲区中,导致scanf接收缓冲数据


这是因为在第一个文本条目之后按enter键的换行符保留在缓冲区中,并且是“%c”格式的有效条目-如果查看“edu”的值,您应该会发现它是一个换行符。

您可以在%c之前添加一个空格。这是必要的,因为与其他转换说明符不同,它不会跳过空白。因此,当用户输入类似于“10\n”的值作为年龄时,第一个
scanf
读取到10的末尾。然后,%c读取换行符。空格指示
scanf
在读取字符之前跳过所有当前空白

printf ("What is the customer's age? \n");
scanf("%d", &age);

printf ("Is the customer a student? (y/n) \n");
scanf(" %c", &edu);

printf ("What is the movies time? (in hours) \n");
scanf("%d", &time);

printf ("Is the movie 3-D? (y/n) \n");
scanf(" %c", &ddd);

使用
scanf
读取输入时,按下返回键后读取输入,但返回键生成的换行符不会被
scanf
使用,这意味着下次从标准输入读取时,将有一个换行符准备好读取

一种避免的方法是使用
fgets
将输入读取为字符串,然后使用
sscanf
提取所需内容


另一种使用换行符的方法是
scanf(“%c%*c”,&edu)
%*c
将从缓冲区读取换行符并将其丢弃。

scanf和“%c”有任何问题,请参见例如:@jamesdlin。 “time”是C-Standard-Lib函数的名称,最好使用其他名称,例如:

int A,B,C,D,age=0,timevar=0;
char edu=0, ddd=0, line[40];

printf ("What is the customer's age? \n");
if( fgets(line,40,stdin) && 1!=sscanf(line,"%d", &age) ) age=0;

printf ("Is the customer a student? (y/n) \n");
if( fgets(line,40,stdin) && 1!=sscanf(line,"%c", &edu) ) edu=0;

printf ("What is the movies time? (in hours) \n");
if( fgets(line,40,stdin) && 1!=sscanf(line,"%d", &timevar) ) timevar=0;

printf ("Is the movie 3-D? (y/n) \n");
if( fgets(line,40,stdin) && 1!=sscanf(line,"%c", &ddd) ) ddd=0;
最后,您的变量有一个定义的内容,输入错误为0=否则为0。

使用fflush(标准输入法)

语句在读取任何字符数据之前清除stdin的缓冲区内存


否则,它会将第一次扫描的输入键值读取到第二次扫描。

我尝试了你的程序,似乎在键入年龄后,当我按enter键时,它会将其视为下一次扫描(即for&edu)的输入,第三个和第四个问题也是如此。我的解决方案可能很幼稚,但您可以在每次执行后使用缓冲区扫描来吸收“Enter”。或者干脆这样做

scanf(" %c", &variable);

(格式字符串中的任何空格都将使scanf吸收所有后续的连续空格)。

可能会有所帮助。最好避免
scanf
scanf(" %c", &variable);