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