为什么第二个scanf()不执行

时间:2017-02-23 05:53:33

标签: 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);
}

当我输入2,0或与第一个scanf()中的格式字符串匹配的内容时,第二个scanf()也会执行。

但是,如果我在第一个2-0中输入scanf()之类的内容,则该程序会跳过第二个scanf()并直接转到printf()

例如,这是程序样本运行的输入和输出。第二行是输入。

Start from here
1-2  
1 0 -2 -856016624u

注意程序如何完全跳过第二个scanf(),然后直接转到printf()。为什么第二个scanf()被忽略了?

3 个答案:

答案 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,22,3

如果您希望输入的内容类似0-22-4,那么您的scanf必须如下:scanf("%d-%d",&e,&f)

通过这种方式,它不会被跳过。