我如何制作我的" Main"函数执行顺序正确吗?

时间:2015-10-11 23:45:57

标签: c function

我试图做一个有条件的if-else循环 然而,在这个问题上,我的主要功能是不按我原定的顺序执行步骤。

#include<stdio.h>
    void draft(int, char);
    void main()
    {
        int age = 0;
        char sex;
        printf("How old are you?");
        scanf_s("%d", &age);
        printf("Please enter your sex.(M or F)");
        scanf_s("%c", &sex);
        draft(age,sex);
        system("pause");
        return;
    }
    void draft(int age,char sex)
    {
        if (age>= 21 && sex=="M")
        {
            printf("Congratulations son, You will be going off to Syria to fight for your country.\n");
        }
        else if (age >= 18 && sex == "M")
        {
            printf("Congratulations son, You will be going off to Vietnam to fight for your country.\n");
        }
        else if (age < 18 && sex == "M")
        {
            printf("Sorry Son you're still too young.\n");
        }
        else if (age >= 21 && sex == "F")
        {
            printf("Sorry,miss, only men can serve.\n");
        }
        else if (age >= 18 && sex == "F")
        {
            printf("Sorry,little lady, only men can serve.\n");
        }
        else if (age < 18 && sex == "F")
        {
            printf("Sorry,little girl, only men can serve.\n");
        }
        else
        {
            printf("Please enter age and sex.");
        }
        return;
    }

提示用户输入他的年龄,但在输入之后,将直接转到&#34;草稿&#34;的最后一个ELSE语句。功能,但没有让用户有机会进入性别。

3 个答案:

答案 0 :(得分:1)

问题是你使用scanf来解析stdin的输入。然而,这只是将其视为流。如果您在第一次输入时输入32F之类的内容,那么您的程序确实有效。

[为了清晰起见编辑:你的程序实际上并没有奇怪地跳跃,发生的事情是第二个scanf立即返回来自stdin的数据,而第一个扫描没有用第一个读取。在这种情况下,它是用户按下回车键时的返回字符。所以它立即返回一个不是你的&#39; M&#39;或者&#39; F&#39;因此它运行最后的其他。没有&#34;乱序&#34;发生]

注意:draft()功能存在第二个问题。您使用"M""F"作为字符串(字符数组),而实际上您需要使用'M''F'作为单个字符。

您想要的是阅读一行并一次解析它。所以我建议进行以下更改。我已将scanfs替换为fgets,这将读取一行。然后使用sscanf来解析该行。

#include<stdio.h>

void draft(int, char);
int main()
{
    int age = 0;
    char sex;
    char line[100] = {0};

    printf("How old are you?");
    fgets(line, sizeof(line), stdin);
    sscanf(line, "%d", &age);
    printf("Please enter your sex.(M or F)");
    fgets(line, sizeof(line), stdin);
    sscanf(line, "%c", &sex);
    draft(age,sex);

    return 0;
}
void draft(int age,char sex)
{
    if (age>= 21 && sex=='M')
    {
        printf("Congratulations son, You will be going off to Syria to fight for your country.\n");
    }
    else if (age >= 18 && sex == 'M')
    {
        printf("Congratulations son, You will be going off to Vietnam to fight for your country.\n");
    }
    else if (age < 18 && sex == 'M')
    {
        printf("Sorry Son you're still too young.\n");
    }
    else if (age >= 21 && sex == 'F')
    {
        printf("Sorry,miss, only men can serve.\n");
    }
    else if (age >= 18 && sex == 'F')
    {
        printf("Sorry,little lady, only men can serve.\n");
    }
    else if (age < 18 && sex == 'F')
    {
        printf("Sorry,little girl, only men can serve.\n");
    }
    else
    {
        printf("Please enter age and sex.");
    }
    return;
}

答案 1 :(得分:1)

两个问题:

第一次调用scanf_s后,缓冲区中会留下换行符。第二个scanf_s会立即获取该换行符。您需要通过在%d%c之前添加空格来更改模式以匹配并放弃任何换行符。此外,您应检查返回值以确保读取与模式匹配的值:

printf("How old are you?");
if (scanf_s(" %d", &age) != 1) {
    printf("You must enter a value age.\n");
    exit(1);
}
printf("Please enter your sex.(M or F)");
if (scanf_s(" %c", &sex) != 1) {
    printf("You must enter a value age.\n");
    exit(1);
}

draft中,您使用双引号而不是单引号作为字符文字:

if (age>= 21 && sex=="M")

这里,"M"是一个包含一个字符和一个NULL终止符的字符串。你想要的是'M',即字符M.所以将上面的行改为:

if (age>= 21 && sex=='M')

对具有相同问题的其他五行进行类似的修复。

答案 2 :(得分:0)

嗯,这是一个问题:

scanf_s("%c", &sex);

%s%d等转化说明符不同,%c说明符不会导致scanf(而且,我假设,scanf_s)跳过输入流中的任何前导空格。所以它会在你第一次输入后立即获取换行符,这就是为什么它不会等你进入性别。

要解决此问题,请在转换说明符前添加一个空格:

scanf_s(" %c", &sex );

另一个问题是您的比较sex == "M"sex == "F"; sex是一个char,但"M""F"是字符字符串。使用比较sex == 'M'sex == 'F'(单引号,而不是双引号)。