似乎跳过了 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);
我试过下面这段代码,但似乎 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);