【问题标题】:What happens when multiple scanf()s are included in a single for loop当多个 scanf() 包含在单个 for 循环中时会发生什么
【发布时间】:2019-12-24 16:39:00
【问题描述】:

我写了一个比较三元组问题的代码。问题陈述是:

输入:2个大小为3的数组

任务是通过将a[0] 与b[0]、a[1] 与b[1] 以及a[2] 与b[2] 进行比较来找到它们的比较点。

如果a[i] > b[i],那么 Alice 将获得积分。如果a[i] < b[i] 则授予 Bob 积分。如果a[i] == b[i],那么任何人都不会收到分数。比较点是该人获得的总点数。给定a 和b 确定它们各自的比较点。

我写的代码是:

 #include<stdio.h>
 void main(){   
       int i, alice[3], bob[3];
       int a = 0;
       int b = 0;
                                                                                                                                          
       for(i=0; i<3; i++){
                 scanf("%d", &alice[i]);
       }
       for(i=0; i<3; i++){
                 scanf("%d", &bob[i]); 
       }
       for(i=0; i<3; i++){ 
                if(alice[i] > bob[i])  
                       a++; 
                else if (alice[i] < bob[i]) 
                       b++;
       }   
      printf("%d %d", a, b);
 } 

但是当我把两个scanf()放在一行时,

  for(i=0; i<3; i++){    
             scanf("%d", &alice[i]); 
             scanf("%d", &bob[i]); 
  }

对于所有输入,输出类似于 2 1 或 1 2。将两个 scanf() 调用放在一个 for 循环中是错误的吗?我不明白这个问题背后的原因是什么?有人能解释一下原因吗?

【问题讨论】:

  • 它将以不同的顺序读取它们。哪个正确取决于输入的顺序。
  • 试试printf("enter Alice's value #%d\n", i); scanf("%d", &amp;alice[i]);printf("enter Bob's value #%d\n", i); scanf("%d", &amp;bob[i]);
  • 非常感谢@interjay。解决了。​​
  • 非常感谢@pmg。解决了。​​

标签: c for-loop scanf


【解决方案1】:

第一个版本读取alice 的三个值,然后读取bob 的三个值。第二个版本为alice 读取一个值,然后为bob 读取一个值,并重复3 次。

如果输入的数字是 1、2、3、4、5、6,那么在第一个例子中,alice 得到 1、2、3 而bob 得到 4、5、6;在第二个示例中,alice 得到 1、3、5,而 bob 得到 2、4、6。结果完全不同。

【讨论】:

  • 请注意,尝试了解发生了什么的一个好步骤是在读取数据后打印输入数组:printf("Alice:"); for (int i = 0; i &lt; 3; i++) printf(" %d", alice[i]); putchar('\n'); printf("Bob:"); for (int i = 0; i &lt; 3; i++) printf(" %d", bob[i]); putchar('\n'); 这将显示两种输入数据方式之间的差异。这两个循环中的代码可以重构为函数void print_array(const char *tag, size_t n, int array[n]) { printf("%s:", tag); for (size_t i = 0; i &lt; n; i++) printf(" %d", array[i]); putchar('\n'); },调用两次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
  • 1970-01-01
  • 2018-09-01
  • 2011-12-07
  • 2020-06-13
相关资源
最近更新 更多