当我运行以下代码段时,它会运行直到第二个问题。然后它将“客户是学生?(y / n)\ n”和“电影时间是多少?(以小时为单位)\ n”一起提示(没有区域可以回答它们)。如果从那里采取任何行动,程序将停止工作。我做错了什么? (我很确定它的语法相关)
int A,B,C,D,age,time;
char edu, ddd;
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);
答案 0 :(得分:4)
您可能需要在每次扫描后从stdin中获取额外的输入,这样它就不会在缓冲区中停留并导致scanf接收缓冲的数据。
这是因为在第一个文本条目停留在缓冲区之后命中输入的换行符是“%c”格式的有效条目 - 如果你查看“edu”的值,你会发现它是换行符
答案 1 :(得分:4)
使用scanf
读取输入时,按下返回键后会读取输入,但返回键生成的换行不会被scanf
消耗,这意味着下次读取标准时输入将有一个准备好读取的换行符。
要避免的一种方法是使用fgets
将输入作为字符串读取,然后使用sscanf
提取所需内容。
使用换行符的另一种方法是scanf("%c%*c",&edu);
。 %*c
将从缓冲区中读取换行符并将其丢弃。
答案 2 :(得分:2)
您可以在%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);
答案 3 :(得分:2)
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;
最后你的vars有一个定义的内容,输入错误为0,否则为!= 0。
答案 4 :(得分:1)
使用fflush(stdin);
语句在读取任何字符数据之前清除stdin的缓冲区内存
或者它会将第一个scanf的输入键值读取到第二个scanf。
答案 5 :(得分:0)
我尝试了你的程序,似乎在输入年龄后,当我按下回车时,它认为它是下一个scanf的输入(即& edu),同样是第三和第四个问题。我的解决方案可能很幼稚,但你可以在每一个之后使用缓冲区scanf来吸收“回车”。或者只是这样做
scanf(" %c", &variable);
(格式字符串中的任何空格都会使scanf吸收所有进一步的连续空格。)