如何解决为什么在特定行中使用 getchar ?
如果第 5 行的 getchar() 没有使用,为什么下面的代码会在一轮后终止?
char s;
while(1){
printf("Enter two integers: ");
scanf("%d%d",&a,&b);
getchar();
c = a + b;
printf("Addition of %d & %d is %d\n",a,b,c);
printf("Add more numbers(yes/no): ");
scanf("%c",&s);
if(s == 'y')
continue;
else
break;
}
为什么在下面的代码中使用字符串不起作用?我已经包含了
char s[10];
while(1){
printf("Enter two integers: ");
scanf("%d%d",c);
printf("Add more numbers(yes/no): ");
scanf("%s",s);
if(s == "yes")
continue;
else
break;
}
解决方法
当您输入第一个 scanf("%d%d",&a,&b)
时,您可能用 Enter 键结束。
Enter 键作为换行符添加到 scanf
读取的输入缓冲区中。
如果您没有调用 getchar()
,那么下一个 scanf("%c",&s)
将读取该换行符。
正如您所指出的,一种解决方案是使用 getchar()
读取并丢弃换行符。另一种解决方案是让 scanf
也这样做:
scanf(" %c",&s);
// ^
// Note the space here!
前导空格告诉 scanf
跳过并忽略所有前导空白字符,其中换行符就是这样的一个字符。
请注意,scanf
的大多数格式说明符会自动跳过并忽略前导空格。例如,%s
会这样做,这意味着带有 scanf("%s",s)
的第二个版本不需要 getchar()
调用。
另请注意,通过在调试器中花费五分钟在监视变量及其值的同时逐句逐句执行代码,应该很容易推断出这一点。
然后对于s == "yes"
。这里发生的情况是数组 s
将衰减为指向其第一个元素的指针,文字字符串也是如此,然后您比较这些指针以查看它们是否相同,它们很可能永远不会相同。
它在某种程度上与此等效:
char yes_literal[4] = "yes";
if (&s[0] == &yes_literal[0]) ...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。