我没有在C程序中获得正确的输出?
问题描述:
我使用开发 - C++和代码::块 IDE为C program.I要循环多达10次从user.But我没有得到正确的output.First我第二次从 得到正确的输出后,我没有得到正确的输出。我没有在C程序中获得正确的输出?
#include<stdio.h>
main() {
char g;
int yos,qual,sal,a = 1;
printf("\nEnter M for Male and F for Female");
printf("\nEnter 0 for Graduate and 1 for Post-Graduate");
while(a<=10) {
printf("\n\n\nEnter gender, year of service , qualification : ");
scanf("%c%d%d",&g,&yos,&qual);
if(g=='M' && yos>=10 && qual==1)
sal = 15000;
else if((g=='M' && yos>=10 && qual==0) || (g=='M' && yos<10 && qual==1))
sal = 10000;
else if(g=='M' && yos<10 && qual==0)
sal = 7000;
else if(g=='F' && yos>=10 && qual==1)
sal = 12000;
else if(g=='F' && yos>=10 && qual==0)
sal = 9000;
else if(g=='F' && yos<10 && qual==1)
sal = 10000;
else if(g=='F' && yos<10 && qual==0)
sal = 6000;
printf("\nSalary of the employee is : %d",sal);
a++;
}
}
答
当您使用
scanf("%c%d%d",&g,&yos,&qual);
执行该语句的第二次,换行字符读入g
。为了防止新行和空格被读入g
,使用方法:
scanf(" %c%d%d",&g,&yos,&qual);
// ^^ Add a space
就个人而言,我喜欢把空间周围的其他格式说明过。
scanf(" %c %d %d", &g, &yos, &qual);
答
两件事。将space
放在%c
之前scanf()
会占用它之前的任何空格,并且检查scanf()
返回的正确输入数量将防止愚蠢的输出。我用newline
分隔符输入第一组,第二组用space
分隔符。
#include <stdio.h>
int main()
{
char g;
int yos, qual;
printf("\nEnter char, int, int: ");
if (3 != scanf(" %c%d%d", &g, &yos, &qual))
printf ("Error\n");
else
printf("You entered: %c %d %d\n", g, yos, qual);
printf("\nEnter char, int, int: ");
if (3 != scanf(" %c%d%d", &g, &yos, &qual))
printf ("Error\n");
else
printf("You entered: %c %d %d\n", g, yos, qual);
return 0;
}
程序的输入/输出
Enter char, int, int: a
1
2
You entered: a 1 2
Enter char, int, int: b 6 7
You entered: b 6 7
答
的问题是在你的scanf()
格式。大多数格式描述符隐含地跳过前导空格,但%c
不(因此它可以用于读取空格)。此外,scanf()
只要能够与格式匹配就可以读取字符,并且任何不能匹配的字符都会被读取。考虑这一点,则:
scanf("%c%d%d",&g,&yos,&qual);
在第一次迭代,它
- 读取 'M' 为可变
g
, - 第一数目之前跳过空白(换行)
- 读取数字串“10”(最多但不包括换行符),将其转换为整数,并将其存储在
yos
, - 跳过下一个空白符(换行符)数字
- 读取数字字符串“1”(最多但不包括换行符),将其转换为整数,并将其存储在
qual
中。
此时,等待输入的下一个字符是换行符。
在第二次迭代,换行符被扫描到可变g
,和scanf()
尝试匹配的整数开始与下一个字符(“M”)。这失败了,所以scanf()
完成,你的程序继续打印它的输出。
这是一个有点棘手做交互输入与scanf()
,但你会做一个好一点的有轻微的修改,您的格式:
scanf(" %c%d%d",&g,&yos,&qual);
此外,您应经常检查返回值来验证scanf()
已成功匹配所有预期字段(它返回成功匹配的字段数,或者错误地输入EOF
,或者如果在任何字段匹配之前达到输入的结尾)。
为什么你没有第二次提供服务年限和资质? – Razib 2015-03-31 19:13:09
因为当他点击'enter'时,它只是打印出薪水而不是等待更多输入 – 2015-03-31 19:15:28
检查'scanf'的返回值。值不会在第二次改变。 – HuStmpHrrr 2015-03-31 19:16:41