接受未知大小的数组输入

Taking input of unknown size of array

提问人:Subhradwip Ghosh 提问时间:7/23/2020 最后编辑:Subhradwip Ghosh 更新时间:8/4/2020 访问量:81

问:

#include <stdio.h>
int main() 
{
    int a[50],i,n=0;
    while(scanf("%d",&a[n++])!=EOF);
    n--;
    for(i=0;i<n;i++)
    {
        printf("%d ",a[i]);
    }
    return 0;
}

输入: 5 6 7 8 9

输出: 5 6 7 8 9

我的问题是为什么上面的代码在在线 C 编译器中工作并给出正确的 EOF(-1)

但是,在离线 C IDE 中(如代码块)中运行代码时,由于它没有提供任何 EOF,因此会导致输入的无限循环,以及如何在离线编译器中获得类似的结果?

数组 C 输入 scanf eof

评论

6赞 MikeCAT 7/23/2020
难道不是因为您没有提供任何 EOF(在 Windows 上按 Ctrl+Z 或在 Linux 上按 Ctrl+D)吗?
5赞 Support Ukraine 7/23/2020
作为替代:你可以做.然后循环将在第一个非整数输入处停止。while(scanf("%d",&a[n++])!=EOF);while(scanf("%d",&a[n++])==1);
2赞 Support Ukraine 7/23/2020
您还应该检查是否始终小于 50n
5赞 MikeCAT 7/23/2020
添加尺寸检查也很好:while(n < 50 && scanf("%d",&a[n++])==1);
2赞 Weather Vane 7/23/2020
检查具体来源的另一个原因是,如果您输入的数据无法转换,您将进入无限循环,因为也是如此。1scanf0 != EOF

答:

1赞 Abcd Efg 7/24/2020 #1

该函数返回它扫描的输入值的数量。scanf()

如果输入错误或失败,它将返回 . 正如注释中建议的那样,您可以将返回值与 1 进行比较,以查看它是否具有有效的输入。因此,如果您的输入不是 ,它将结束循环。EOFscanf()int

此外,在调用之前确保仍在数组范围内也是一个好主意。nscanf()

所以你可以这样写代码

#include <stdio.h>

int main ()
{
    int a[50], n = 0;

    while((n < 50) && (scanf("%d", &a[n++]) == 1));

    n--;

    for (int i = 0; i < n; i++)
    {
        printf("%d", a[i]);
    }
    
    return 0;
}