2015-03-31 89 views
0

我使用开发 - 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++; 
    } 

} 

enter image description here

+0

为什么你没有第二次提供服务年限和资质? – Razib 2015-03-31 19:13:09

+1

因为当他点击'enter'时,它只是打印出薪水而不是等待更多输入 – 2015-03-31 19:15:28

+0

检查'scanf'的返回值。值不会在第二次改变。 – HuStmpHrrr 2015-03-31 19:16:41

回答

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); 
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

的问题是在你的scanf()格式。大多数格式描述符隐含地跳过前导空格,但%c不(因此它可以用于读取空格)。此外,scanf()只要能够与格式匹配就可以读取字符,并且任何不能匹配的字符都会被读取。考虑这一点,则:

scanf("%c%d%d",&g,&yos,&qual); 

在第一次迭代,它

  1. 读取 'M' 为可变g
  2. 第一数目之前跳过空白(换行)
  3. 读取数字串“10”(最多但不包括换行符),将其转换为整数,并将其存储在yos,
  4. 跳过下一个空白符(换行符)数字
  5. 读取数字字符串“1”(最多但不包括换行符),将其转换为整数,并将其存储在qual中。

此时,等待输入的下一个字符是换行符。

在第二次迭代,换行符被扫描到可变g,和scanf()尝试匹配的整数开始与下一个字符(“M”)。这失败了,所以scanf()完成,你的程序继续打印它的输出。

这是一个有点棘手做交互输入与scanf(),但你会做一个好一点的有轻微的修改,您的格式:

scanf(" %c%d%d",&g,&yos,&qual); 

此外,您应经常检查返回值来验证scanf()已成功匹配所有预期字段(它返回成功匹配的字段数,或者错误地输入EOF,或者如果在任何字段匹配之前达到输入的结尾)。