我正在尝试做一个条件和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'
(单引号,而不是双引号(。