我是新的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);
}
更改
scanf("%c", &sex);
至
scanf(" %c", &sex);
^
space
和
scanf("%c", &status);
至
scanf(" %c", &status);
^
space
问题是,因为你的第二个呼叫scanf()
后尾随换行符。既然是%d
类型说明符的,当你按下一个回车换行符字符('\n'
)留在流中的下一个scanf()
试图读取换行符,因此,它好像它只是跳过输入,但事实上,它读取换行符。
所以,换行符被存储在变量sex
,因此,它会跳过要求您为变量输入。
更改您的代码
#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
。
除非你有兴趣的空白像换行,不要使用%c
。使用时只需将字符串转换%s
和使用输入的第一个字符。
理由:除了scanf
所有%c
转换说明会忽略空格,包括换行。它们被设计为读取输入令牌(数字,文字),其中的空白空间的量和性质无关的序列。词语都可以在同一行上,或在不同的行的每个字; scanf
不会在意,除非你强制与%c
这是几乎从来没有必要单个字符的读取。
这是因为blankspace也被视为一个字符,当你按enter键发生。所以,留出空间。
scanf("(space)%c",&something);
你可以做所有scanf
s以下。
scanf("%c\n",&smth);
然后输入一个值一个接换行分隔它们(按Enter键)。
这帮助了我太多,当我有同样的问题。
scanf("%c*",&smth);
这使得scanf
跳过任何其他字符,一个用户可能输入,包括换行。
注意:使用适当的格式字符串为每种类型(%s
字符串,%d
为整数,等)。