【问题标题】:How to read until EOF and print the even/odd numbers entered?如何阅读直到 EOF 并打印输入的偶数/奇数?
【发布时间】:2017-10-02 12:27:12
【问题描述】:

我有下面的 C 代码,它读取用户输入直到文件结束 (ctrl+d) 并将它们存储在一个数组中。然后,它应该在一行中打印所有奇数,然后在另一行中打印偶数。由于某种原因,它没有按预期工作。

当我输入以下内容时:

    1
    2
    4
    16
    32
    64
    128
    256
    512
    1024
    2048
    4096

    the output is: 

    Odd numbers were: 
    Even numbers were: 2 16 64 256 1024 4096

    Expected output: 

    Odd numbers were: 1
    Even numbers were: 2 4 16 32 64 128 256 512 1024 2048 4096 

代码如下:

#include <stdio.h> 


int main(void){
    int array[1000];
    int i,j,k;
    int counter = 0; 

    for(i=0; scanf("%d", &array[i]) != EOF; i++){
        scanf("%d", &array[i]);
        counter = counter+1; 
    }

    printf("Odd numbers were: ");

    for(j=0; j<counter; j++){
        if(array[j]%2 != 0){
            printf("%d ", array[j]);
        }
    }
    printf("\n");

    printf("Even numbers were: ");

    for(k=0; k<counter ; k++){
        if(array[k]%2 == 0){
            printf("%d ", array[k]);
        }
    }
    printf("\n");

}

【问题讨论】:

  • 你知道你可以完全摆脱jk吗?
  • 你注意到第一个 for 循环上下文中的双 scanf() 还是只有我?
  • for(i=0; i &lt; 1000 &amp;&amp; scanf("%d", &amp;array[i]) == 1; i++) { counter = counter+1; }
  • 第一个是'for'循环中的文件结束条件,除非有更有效的方法,可能有。
  • @novice 在任何地方都使用i,无论如何,您在每个循环开始时都将其重新分配为0。 :)

标签: c


【解决方案1】:

好吧,您已经接受了一种完全不同的方法,但是您的示例不正确,因为您在每个循环阶段都做了一个 scanf,然后在 for 正文中又做了一个,所以您做了 两个 scanf's 在每个循环通过,这使得第二个值杀死数组元素 i 中的第一个值。这使您释放了一半的读取元素并解释了您得到的输出。只需将scanf 放到循环体内就可以让它正常工作,可能。

【讨论】:

    【解决方案2】:

    您的问题有一个更简单的解决方案

    希望你喜欢

    #include<stdio.h>
    
    
    int main()
    {
    
       int num,od = 0, ev = 0;
       int odd[1000],even[1000];
    
       while(scanf("%d",&num) == 1)
       {
          if(num%2==0)
          {
              even[ev] = num;
              ev++;
          }
          else
          {
              odd[od] = num;
              od++;
          }
       }
    
       printf("Odds numbers are: ");
    
       for(int i = 0;i<od;i++)
       {
           printf("%d ",odd[i]);
       }
    
       printf("\nEven numbers are: ");
    
       for(int i = 0;i<ev;i++)
       {
            printf("%d ",even[i]);
       }
    
    
       return 0;
    }
    

    程序输出与预期输出匹配

    快乐编码

    【讨论】:

    • 对治愈的解释会改善这个答案。
    • 如果用户输入非数字输入,while(scanf("%d",&amp;num) != EOF) 是一个无限循环。 while(scanf("%d",&amp;num) == 1) 更好。最好与想要的 1 进行比较,而不是与不需要的返回值之一 EOF 进行比较。
    • 但是,在这两种方法中,用户都需要使用 ctrl+Z 来结束输入
    • 在这个答案的方法中,输入"1\n""2\n""X\n""4\n"ctrl+Z,由于'X'没有被消耗,代码将永远循环。用户有时会犯错误。代码应该做什么?让用户满足其需求或提供建设性反馈?
    猜你喜欢
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 2017-10-18
    相关资源
    最近更新 更多