为什么赢了';t执行第二个scanf()

为什么赢了';t执行第二个scanf(),c,scanf,C,Scanf,我正在尝试执行这段代码 #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); } 注意程序是如何完全跳过第

我正在尝试执行这段代码

#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);
}
注意程序是如何完全跳过第二个
scanf()
,直接转到
printf()
。为什么第二个
scanf()
被跳过了?

在你的代码中,
scanf(“%d,%d”,&e,&f)
是这样的,所以你应该像这样输入:
1,2
2,3
等等

如果您希望您的输入像
0-2
2-4
那样给出,那么您的scanf必须是这样的:
scanf(“%d-%d”,&e,&f)


这样,它就不会被跳过。

scanf
的格式字符串也关心其中的非格式说明符。当你写“1-2”时,第一次扫描将显示“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);
}
#包括
内部主(空)
{       
printf(“从这里开始\n”);
int e,f,g,h;
如果(scanf(“%d,%d”,&e,&f)!=2){/*错误处理*/}
如果(scanf(“%d,%d”,&g,&h)!=2){/*错误处理*/}
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
只会跳过空白
逗号
不是空白

当您要求scanf读取数字数据时,实际发生的情况是,它首先跳过找到的任何空白,然后读取字符,直到读取的字符不能构成数字的一部分


在这种情况下,当遇到逗号时,它停止读取。由于它没有读取任何数字,因此没有可存储的数字,因此它只保留原始值。

1-2
应该是
1,-2
?也就是说,数字之间有一个逗号。因为这就是你告诉scanf的期望。你的第二个scanf正在执行中
e
获取
1
g
获取
-2
为什么不检查
scanf
的返回值?阅读手册页False可能很方便。程序不会“跳过”第二个
scanf
——程序会执行它,但结果与您预期的不同。只要阅读一本关于
scanf()
的手册,就可以了解当您提供与格式不兼容的输入时会发生什么,以及如何检测和处理错误。这是检查
scanf()返回值(而不是参数值)时的多次操作之一
将在第一次调用
scanf()
时通知代码无法读取这两个参数,第二次调用
scanf()
时无法读取这两个参数注意:作为错误处理的一部分,您可能需要放弃一些用户输入!这可以使用
getchar
循环或
scanf(“%*[^\n]”)来完成;getchar()例如…还要注意:在本例中,空格在语义上没有意义;这两个格式字符串在功能上是等效的,因为
%d
无论如何都会隐式放弃前导空格。很高兴知道,删除了有关格式字符串的位。为什么在
时使用
,而不是
如果
?如果按照Seb的建议刷新我编写的
/*错误处理*/
中的stdin,您可以再次提示用户输入(如果不这样做,可能只会得到一个无限循环)。使用
if
将跳到下一次扫描(或打印,这将导致打印垃圾)。
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