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

Nat*_*thu 14 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);
}
Run Code Online (Sandbox Code Playgroud)

当我输入2,0或匹配第一个格式字符串的东西时,scanf()第二个scanf()也执行.

但是,如果我输入类似于2-0第一个的东西scanf(),程序会跳过第二个scanf()并直接进入printf()

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

Start from here
1-2  
1 0 -2 -856016624u
Run Code Online (Sandbox Code Playgroud)

注意程序如何完全跳过第二个scanf(),并直接进入printf().为什么第二个scanf()被跳过这里?

Pet*_*r G 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);
}
Run Code Online (Sandbox Code Playgroud)

  • 注意:作为*错误处理*的一部分,您可能需要丢弃一些用户输入!这可以使用`getchar`循环或`scanf("%*[^ \n]")来完成; getchar();`例如...... (5认同)
  • 另请注意:在这种情况下,空间在语义上毫无意义; 两个格式字符串在功能上是等价的,因为`%d`将隐式丢弃前导空格**. (5认同)

小智 1

在您的代码中,scanf("%d, %d",&e,&f)是这样的,所以您应该给出如下输入:1,22,3

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

这样就不会被跳过了。