似乎在c中跳过了scanf函数

时间:2015-04-21 14:36:05

标签: c

我是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);
}

5 个答案:

答案 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表示整数等。)