似乎跳过了 scanf("%c") 调用

scanf("%c") call seems to be skipped

我试过下面这段代码,但似乎 scanf("%c") 被跳过了。它只要求我输入姓名和年龄并跳过下面的行。它只是在 if 语句上方打印 printf 中的文本。有人可以帮忙吗?

#include<stdio.h>

int 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);
}

改变

scanf("%c", &sex);

scanf(" %c", &sex);
       ^
      space

scanf("%c", &status);

scanf(" %c", &status);
       ^
      space

问题是因为您第二次调用 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;
}

在这里,我在格式说明符 %c 之前添加了一个额外的 space,以容纳任何先前的输入,例如换行符 (\n)。
另一种替代方法是在输入任何字符之前立即使用 getchar()

另外,如果用scanf进行字符串输入,遇到白色space后不会读取输入。因此,改为使用 fgets 来获取可能包含 spaces.

的任何字符串输入

我在您的代码中更改的另一件事(微不足道)是 int main()return 0

除非你对换行符之类的白色space感兴趣,否则不要使用%c。只需使用字符串转换 %s 并使用输入的第一个字符。

基本原理:除 %c 之外的所有 scanf 转换说明符都会忽略白色 space,包括换行符。它们旨在读取输入标记序列(数字、单词),其中白色 space 的数量和性质无关紧要。单词可以全部在同一行,也可以每个单词在不同的行; scanf 不会在意,除非你用 %c 强制读取单个字符,这几乎从来没有必要。

发生这种情况是因为空白space 也被视为一个字符,并且在您按回车键时发生。 所以留下一个space.

scanf(" %c",&something);