帮助C scanf语法

时间:2010-09-16 04:42:16

标签: c syntax

当我运行以下代码段时,它会运行直到第二个问题。然后它将“客户是学生?(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);

6 个答案:

答案 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吸收所有进一步的连续空格。)