【问题标题】:Taking input of unknown size of array输入未知大小的数组
【发布时间】:2020-11-13 08:54:48
【问题描述】:
#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

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

但是,在像 Codeblocks 这样的离线 C IDE 中运行代码时,它会导致输入的无限循环,因为它没有给出任何 EOF,以及如何在离线编译器中获得类似的结果?

【问题讨论】:

  • 难道不是因为 你 没有给出任何 EOF(Windows 上的 Ctrl+Z 或 Linux 上的 Ctrl+D)吗?
  • 作为while(scanf("%d",&amp;a[n++])!=EOF); 的替代品,您可以使用while(scanf("%d",&amp;a[n++])==1);。然后循环将在第一个非整数输入处停止。
  • 您还应该检查 n 是否始终小于 50
  • 还可以添加大小检查:while(n &lt; 50 &amp;&amp; scanf("%d",&amp;a[n++])==1);
  • 从scanf 中检查特定1 的另一个原因是,如果您输入无法转换的数据,您将进入无限循环,因为0 != EOF 也是如此。

标签: arrays c input scanf eof


【解决方案1】:

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

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

在调用scanf() 之前确保n 仍在数组范围内是个好主意。

所以你可以这样写代码

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-04
    • 2018-08-31
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    相关资源
    最近更新 更多