如何读取输入直到文件结束并打印出其中的偶数/奇数数字?

5
我有以下的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 吗? - Sourav Ghosh
2
你有没有注意到第一个for循环上下文中有两个scanf(),还是只有我注意到了? - Sourav Ghosh
for(i=0; i < 1000 && scanf("%d", &array[i]) == 1; i++) { counter = counter+1; } - BLUEPIXY
@BLUEPIXY 哦,谢谢!那个方法可行。抱歉,我不知道 scanf("%d", &array[i]) == 1; 实际上是读取输入的。我以为它只是检查文件结尾。 - Programmer
1
@新手,你可以在任何地方使用 i,因为你每次循环开始时都会将其重新赋值为0。 :) - Sourav Ghosh
显示剩余7条评论
2个回答

4

有一个更简单的解决方案可以解决你的问题

希望你会喜欢它

#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;
}

程序输出与期望输出相匹配

愉快的编码!


解释一下解决方法会改善这个答案。 - chux - Reinstate Monica
3
如果用户输入了非数字字符,while(scanf("%d",&num) != EOF)将会成为一个无限循环。更好的方式是使用while(scanf("%d",&num) == 1),它与期望值1进行比较,而不是与不需要的返回值EOF之一进行比较。请注意不要改变原来的意思。 - chux - Reinstate Monica
1
但是,用户需要在两种方法中使用Ctrl+Z来结束输入。 - SHAH MD IMRAN HOSSAIN
1
在这个答案的方法中,输入 "1\n", "2\n", "X\n", "4\n", ctrl+Z,代码将会无限循环,因为 'X' 没有被消耗。用户有时会犯错误。那么代码应该怎么做呢?是迎合用户的需求还是提供建设性的反馈? - chux - Reinstate Monica

0

嗯,你采用了完全不同的方法,但你的示例是错误的,因为你在每个循环阶段都进行了一次scanf,然后在for体内又进行了另一次,所以你在每次循环通过时进行了两次scanf,这使得第二个值覆盖了数组元素i中的第一个值。这导致你丢失了一半读取的元素,并解释了你得到的输出结果。只需删除循环体内的scanf即可使其正常工作,可能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接