我是c语言的新手,我在下面尝试了这个代码,但似乎已经跳过了scanf,当我运行这段代码时,它只是要求我输入名称和年龄并跳过下面的行,它只是打印出来printf上方的文字" if"句子,有人可以帮忙吗?
#include<stdio.h>
void main()
{
int age;
char sex;
char name[20];
char status;
printf("Enter your last name\n");
scanf("%s", &name);
printf("Enter your age\n");
scanf("%d", &age);
printf("Enter sex (M/F)\n");
scanf("%c", &sex);
printf("your status,married, single,irrelevant (M/S/I)\n");
scanf("%c", &status);
if(age>=16 && sex=='M')
printf("hello, Mr %s\n", name);
if(age<16 && sex =='M')
printf("hello, Master %s\n", name);
if(sex=='F' && status=='M')
printf("hello, Mrs %s\n", name);
if(sex=='F' &&(status=='S' ||status=='I'))
printf("hello,miss %s\n", name);
}
答案 0 :(得分:3)
更改
scanf("%c", &sex);
到
scanf(" %c", &sex);
^
space
和
scanf("%c", &status);
到
scanf(" %c", &status);
^
space
问题是因为在第二次调用scanf()
后跟踪换行符。由于它是%d
类型说明符,当您按 Enter 时,新行字符('\n'
)将保留在流中,而下一个scanf()
会尝试读取该字符换行符,因此,它似乎只是跳过了输入,但实际上,它读取了换行符。
因此,换行符存储在变量sex
中,因此,它跳过请求您输入该变量。
答案 1 :(得分:0)
将您的代码更改为
#include<stdio.h>
int main()
{
int age;
char sex;
char name[20];
char status;
printf("Enter your last name\n");
// scanf("%s", &name);
fgets(name,20,stdin);
printf("Enter your age\n");
scanf("%d", &age);
printf("Enter sex (M/F)\n");
scanf(" %c", &sex);
printf("your status,married, single,irrelevant (M/S/I)\n");
scanf(" %c", &status);
if(age>=16 && sex=='M')
printf("hello, Mr %s\n", name);
if(age<16 && sex =='M')
printf("hello, Master %s\n", name);
if(sex=='F' && status=='M')
printf("hello, Mrs %s\n", name);
if(sex=='F' &&(status=='S' ||status=='I'))
printf("hello,miss %s\n", name);
return 0;
}
在这里,我在格式说明符%c
之前添加了一个额外的空格,以适应任何先前的输入,如换行符(\ n)。
另一种替代方法是在你输入任何字符之前立即使用getchar()
。
此外,如果使用scanf
执行字符串输入,则在遇到空格后不会读取输入。因此,请使用fgets
来获取可能包含空格的任何字符串输入。
我在代码中更改的另一件事(微不足道)是int main()
和return 0
。
答案 2 :(得分:0)
除非您对新行等空格感兴趣,否则请勿使用%c
。只需使用字符串转换%s
并使用输入的第一个字符。
基本原理:除scanf
之外的所有%c
转换说明符都会忽略空格,包括换行符。它们被设计用于读取输入令牌(数字,单词)的序列,其中白色空间的数量和性质是无关紧要的。单词可以全部在同一行,也可以在不同的行上;除非您使用scanf
强制执行单个字符读取,否则%c
将无关紧要。
答案 3 :(得分:0)
之所以会发生这种情况,是因为空格也被视为字符,并且在按Enter键时发生。 因此,请留一个空间。
scanf("(space)%c",&something);
答案 4 :(得分:-1)
您可以对所有scanf
执行以下操作。
scanf("%c\n",&smth);
然后逐个输入值,用换行符分隔它们(按 Enter )。
当我遇到同样的问题时,这对我也很有帮助。
scanf("%c*",&smth);
这使scanf
跳过用户可能输入的任何其他字符,包括换行符。
注意:为每种类型使用适当的格式字符串(%s
表示字符串,%d
表示整数等。)