[英]Why won't the second scanf() execute
我正在尝试执行这段代码。
#include <stdio.h>
int main(void)
{
printf("Start from here\n");
int e, f, g, h;
scanf("%d,%d", &e, &f);
scanf("%d, %d", &g, &h);
printf("%d %d %d %d", e, f, g, h);
}
当我输入2,0
或与第一个scanf()
中的格式字符串匹配的东西时,第二个scanf()
也会执行。
但是,如果我在第一个scanf()
输入类似2-0
的内容,程序将跳过第二个scanf()
并直接进入printf()
例如,这是程序样本运行的输入和输出。 第二行是输入。
Start from here
1-2
1 0 -2 -856016624u
注意程序如何完全跳过第二个scanf()
,然后直接进入printf()
。 为什么在这里跳过第二个scanf()
?
scanf
的格式字符串也关注其中的非格式说明符。 当您写“1-2”时,第一个scanf将显示为“1”,然后查找逗号。 它不会找到一个,所以它会放弃。 现在,第二个scanf将看到“-2”,然后查找逗号。 它不会找到一个,所以它会放弃。
最终结果是其他两个变量不会被设置,因此它们最终会成为执行时内存位置中的垃圾。
您可以通过检查scanf的返回值来避免这种情况。 它会告诉你它找到了多少值。 尝试这个:
#include <stdio.h>
int main(void)
{
printf("Start from here\n");
int e, f, g, h;
if (scanf("%d,%d", &e, &f) != 2) { /* error handling */ }
if (scanf("%d, %d", &g, &h) != 2) { /* error handling */ }
printf("%d %d %d %d", e, f, g, h);
}
删除两个格式说明符之间的逗号 。
scanf("%d %d", &e, &f); // Remove comma in first argument of scanf
scanf("%d %d", &g, &h); // Remove comma in first argument of scanf
^^^
Remove comma between two numbers
因为scanf
只会跳过空格而comma
不是空格 。
当你要求scanf
读取数字数据时实际发生的事情是它首先跳过它找到的任何空格,然后它读取字符,直到它读取的字符不能形成数字的一部分。
在这种情况下,当遇到逗号时 ,它会停止读取。 由于它没有读取任何数字,因此没有数字可供存储,因此它只保留原始值。
在你的代码中, scanf("%d, %d",&e,&f)
是这样的,所以你应该给你的输入如: 1,2
或2,3
等
如果您希望输入为0-2
或2-4
,则scanf必须如下: scanf("%d-%d",&e,&f)
。
这样就不会跳过它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.