scanf函数似乎在C跳过

问题描述 投票:0回答:5

我是新的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);
}
c
5个回答
3
投票

更改

scanf("%c", &sex);

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

scanf("%c", &status);

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

问题是,因为你的第二个呼叫scanf()后尾随换行符。既然是%d类型说明符的,当你按下一个回车换行符字符('\n')留在流中的下一个scanf()试图读取换行符,因此,它好像它只是跳过输入,但事实上,它读取换行符。

所以,换行符被存储在变量sex,因此,它会跳过要求您为变量输入。


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


0
投票

除非你有兴趣的空白像换行,不要使用%c。使用时只需将字符串转换%s和使用输入的第一个字符。

理由:除了scanf所有%c转换说明会忽略空格,包括换行。它们被设计为读取输入令牌(数字,文字),其中的空白空间的量和性质无关的序列。词语都可以在同一行上,或在不同的行的每个字; scanf不会在意,除非你强制与%c这是几乎从来没有必要单个字符的读取。


0
投票

这是因为blankspace也被视为一个字符,当你按enter键发生。所以,留出空间。

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

-1
投票

你可以做所有scanfs以下。

scanf("%c\n",&smth);

然后输入一个值一个接换行分隔它们(按Enter键)。

这帮助了我太多,当我有同样的问题。

scanf("%c*",&smth);

这使得scanf跳过任何其他字符,一个用户可能输入,包括换行。


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

© www.soinside.com 2019 - 2024. All rights reserved.