在c中似乎跳过了scanf函数

在c中似乎跳过了scanf函数,c,C,我是c语言新手,我尝试了下面的代码,但似乎scanf被跳过了,当我运行此代码时,它只要求我输入姓名和年龄,并跳过了下面的行,它只是在printf中的“如果”语句上方打印文本,有人能帮我吗 #include<stdio.h> void main() { int age; char sex; char name[20]; char status; printf("Enter your last name\n"); scanf("%s", &

我是c语言新手,我尝试了下面的代码,但似乎scanf被跳过了,当我运行此代码时,它只要求我输入姓名和年龄,并跳过了下面的行,它只是在printf中的“如果”语句上方打印文本,有人能帮我吗

#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);
}
#包括
void main()
{
智力年龄;
性别;
字符名[20];
字符状态;
printf(“输入您的姓氏\n”);
scanf(“%s”、&name);
printf(“输入您的年龄”);
scanf(“%d”和年龄);
printf(“输入性别(男/女)\n”);
scanf(“%c”、&sex);
printf(“您的身份、已婚、单身、无关(M/S/I)\n”);
scanf(“%c”、&status);
如果(年龄>=16岁,性别='M')
printf(“你好,先生%s\n”,姓名);
如果(年龄改变

scanf("%c", &sex);

问题是因为在第二次调用
scanf()
后出现了尾随的换行符。由于它是
%d
类型说明符,当您按Enter键时,一个换行符(
'\n'
)会留在流中,而下一个
scanf()
尝试读取该换行符,因此,它似乎只是跳过了输入,但实际上,它读取了该换行符


因此,换行符存储在变量
sex
中,因此,它会跳过向您请求该变量的输入。

您可以对所有
scanf
执行以下操作

scanf("%c\n",&smth);
然后逐个输入值,并用换行符分隔(按enter键)

当我遇到同样的问题时,这也帮助了我

scanf("%c*",&smth);
这使得
scanf
跳过用户可能输入的任何其他字符,包括换行符


注意:对每种类型使用适当的格式字符串(
%s
用于字符串,
%d
用于整数等)。

将代码更改为

#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;
}
#包括
int main()
{
智力年龄;
性别;
字符名[20];
字符状态;
printf(“输入您的姓氏\n”);
//scanf(“%s”、&name);
fgets(名称,20,标准DIN);
printf(“输入您的年龄”);
scanf(“%d”和年龄);
printf(“输入性别(男/女)\n”);
scanf(“%c”、&sex);
printf(“您的身份、已婚、单身、无关(M/S/I)\n”);
scanf(“%c”、&status);
如果(年龄>=16岁,性别='M')
printf(“你好,先生%s\n”,姓名);

如果(age除非您对诸如换行符之类的空格感兴趣,否则不要使用
%c
。只需使用字符串转换
%s
,并使用输入的第一个字符即可


理由:除
%c
之外的所有
scanf
转换说明符忽略包括换行符在内的空白。它们用于读取输入标记序列(数字、单词)如果空格的数量和性质不相关。单词可以全部在同一行上,也可以每个单词在不同的行上;
scanf
不会在意,除非您使用
%c
强制读取单个字符,这几乎是不必要的。

这种情况发生的原因是空格也被视为字符,并且在按回车键。 所以留下一个空间

scanf("(space)%c",&something);

您应该缩进代码。除非您对诸如换行符之类的空格感兴趣,否则不要使用
%c
。只需使用字符串转换
%s
,并使用输入的第一个字符即可。
scanf("%c*",&smth);
#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;
}
scanf("(space)%c",&something);