似乎在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
表示整数等)。