我试图做一个有条件的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语句。功能,但没有让用户有机会进入性别。
答案 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'
(单引号,而不是双引号)。