c语言 - 如何使"Main"函数以正确的顺序执行?



我正在尝试做一个条件和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;
    }

系统会提示用户输入他的年龄,但输入后,它将直接转到"草稿"功能的最后一个 ELSE 语句,而不给用户输入性别的机会。

问题是你正在使用scanf来解析来自stdin的输入。但是,这只是将其视为流。如果您在第一次输入时输入类似 32F 的内容,您的程序实际上可以工作。

[为清楚起见进行编辑:您的程序实际上并没有奇怪地跳跃,正在发生的事情是第二个扫描立即返回来自 stdin 的数据,而第一个扫描没有读取这些数据。在这种情况下,它是用户按回车键时的返回字符。因此,它立即返回一个不是您的"M"或"F"的值,因此它会运行最终的else。没有发生"失序"]

注意: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;
}

两个问题:

在第一次调用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')

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

嗯,这是一个问题:

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'(单引号,而不是双引号(。

相关内容

  • 没有找到相关文章

最新更新