我正在为C程序使用 Dev-c ++ 和 Code :: Blocks IDE.I想从用户循环最多10次。但我没有得到正确的输出。我是第一次 从第二次开始获得正确的输出我没有得到正确的输出。
#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++;
}
}
答案 0 :(得分:3)
两件事。在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
答案 1 :(得分:2)
使用时
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);
答案 2 :(得分:1)
问题出在scanf()
格式。大多数格式描述符隐式跳过前导空格,但%c
没有(因此它可以用于读取空白)。此外,只要scanf()
可以与格式匹配, scanf("%c%d%d",&g,&yos,&qual);
就会读取字符,而任何无法匹配的字符都会被读取。考虑一下,然后:
g
在第一次迭代中,它
yos
,qual
,g
。此时,输入中等待的下一个字符是换行符。
在第二次迭代中,新行被扫描到变量scanf()
,scanf()
尝试匹配以 next 字符开头的整数( 'M')。这失败了,所以scanf()
完成,程序继续打印输出。
使用scanf(" %c%d%d",&g,&yos,&qual);
进行交互式输入有点棘手,但稍微修改一下格式就可以做得更好:
scanf()
此外,您应该始终检查返回值以验证EOF
是否已成功匹配所有预期字段(它返回成功匹配的字段数,或者{{1}}出错,或者如果结束在匹配任何字段之前达到输入。)