似乎在c中跳过了scanf函数

我是c语言的新手,我在下面尝试了这个代码,但似乎scanf已被跳过,当我运行此代码时,它只询问我输入名称和年龄并跳过下面的行,它只是打印文本中的printf在“if”句子之上,有人可以帮忙吗?

#include 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类型说明符,当你按Enter键时 ,新行字符( '\n' )留在流中,下一个scanf()尝试读取该换行符,因此,好像它只是跳过了输入,但事实上,它读取换行符。

因此,换行符存储在变量sex ,因此,它跳过要求您输入该变量。

将您的代码更改为

 #include 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并使用输入的第一个字符。

基本原理:除%c之外的所有scanf转换说明符都忽略包含换行符的空格。 它们被设计用于读取输入令牌(数字,单词)的序列,其中白色空间的数量和性质是无关紧要的。 单词可以全部在同一行,也可以在不同行上的每个单词; 除非你用%c强制单个字符读取,否则scanf不会关心,这几乎是不必要的。

您可以对所有scanf执行以下操作。

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

然后逐个输入值,用换行符分隔它们(按Enter键 )。

当我遇到同样的问题时,这对我也有帮助。

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

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


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