如何阅读直到 EOF 并打印输入的偶数/奇数?
Posted
技术标签:
【中文标题】如何阅读直到 EOF 并打印输入的偶数/奇数?【英文标题】:How to read until EOF and print the even/odd numbers entered? 【发布时间】: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");
【问题讨论】:
你知道你可以完全摆脱j
和k
吗?
你注意到第一个 for 循环上下文中的双 scanf() 还是只有我?
for(i=0; i < 1000 && scanf("%d", &array[i]) == 1; i++) counter = counter+1;
第一个是'for'循环中的文件结束条件,除非有更有效的方法,可能有。
@novice 在任何地方都使用i
,无论如何,您在每个循环开始时都将其重新分配为0。 :)
【参考方案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",&num) != EOF)
是一个无限循环。 while(scanf("%d",&num) == 1)
更好。最好与想要的 1
进行比较,而不是与不需要的返回值之一 EOF
进行比较。
但是,在这两种方法中,用户都需要使用 ctrl+Z 来结束输入
在这个答案的方法中,输入"1\n"
,"2\n"
,"X\n"
,"4\n"
,ctrl+Z
,由于'X'
没有被消耗,代码将永远循环。用户有时会犯错误。代码应该做什么?让用户满足其需求或提供建设性反馈?以上是关于如何阅读直到 EOF 并打印输入的偶数/奇数?的主要内容,如果未能解决你的问题,请参考以下文章