为什么赢了';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