我没有在C程序中获得正确的输出?

时间:2015-03-31 19:07:40

标签: c

我正在为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++;
    }

}

enter image description here

3 个答案:

答案 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

在第一次迭代中,它

  1. 将“M”读入变量yos
  2. 在第一个数字
  3. 之前跳过空格(换行符)
  4. 读取数字字符串“10”(最多但不包括换行符),将其转换为整数,并将其存储在qual
  5. 在下一个数字
  6. 之前跳过空格(换行符)
  7. 读取数字字符串“1”(最多但不包括换行符),将其转换为整数,并将其存储在g
  8. 此时,输入中等待的下一个字符是换行符。

    在第二次迭代中,新行被扫描到变量scanf()scanf()尝试匹配以 next 字符开头的整数( 'M')。这失败了,所以scanf()完成,程序继续打印输出。

    使用scanf(" %c%d%d",&g,&yos,&qual); 进行交互式输入有点棘手,但稍微修改一下格式就可以做得更好:

    scanf()

    此外,您应该始终检查返回值以验证EOF是否已成功匹配所有预期字段(它返回成功匹配的字段数,或者{{1}}出错,或者如果结束在匹配任何字段之前达到输入。)