我正在尝试执行这段代码。
#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()
也会执行。
但是,如果我在第一个2-0
中输入scanf()
之类的内容,则该程序会跳过第二个scanf()
并直接转到printf()
例如,这是程序样本运行的输入和输出。第二行是输入。
Start from here
1-2
1 0 -2 -856016624u
注意程序如何完全跳过第二个scanf()
,然后直接转到printf()
。为什么第二个scanf()
被忽略了?
答案 0 :(得分:21)
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);
}
答案 1 :(得分:2)
删除两个格式说明符之间的逗号。
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
读取数字数据时,实际发生的事情是它首先跳过它找到的任何空格,然后它会读取字符,直到它读取的字符不能构成数字的一部分。
在这种情况下,当遇到逗号时,它会停止阅读。由于它没有读取任何数字,因此没有数字可供存储,因此它只保留原始值。
答案 2 :(得分:1)
在您的代码中,scanf("%d, %d",&e,&f)
就是这样,所以您应该提供以下输入:1,2
或2,3
等
如果您希望输入的内容类似0-2
或2-4
,那么您的scanf必须如下:scanf("%d-%d",&e,&f)
。
通过这种方式,它不会被跳过。