【问题标题】:how to correctly use a scanf and a EOF?如何正确使用 scanf 和 EOF?
【发布时间】:2017-11-30 00:52:45
【问题描述】:

我正在尝试用从用户那里获得的数字填充我的 int 数组。

但是当我尝试printf 一个更大的特定索引时,它显示错误的数字。

for(B_index=0,checker=0; B_index<SIZE&&!checker; B_index++)
    {

        checker=scanf("%d",&B[B_index]);

        if(checker==EOF)
        {
            checker=1;
        }

        else if(checker<1)
        {
            printf("error");
            return 1;
        }

    }
    printf("%d",B[1]); 

【问题讨论】:

  • 这是因为 C 数组不进行边界检查,即编译器不检查对数组中元素的访问是否超出数组的边界。为什么?两个原因: 1. C 数组在运行时转换为指针,因此每次访问数组中的元素就像在做指针运算。 2. 因为它为语言提供了更快的速度,所以需要在可靠性和速度之间进行权衡。

标签: c scanf eof


【解决方案1】:

scanf 返回分配的数量,所以如果你在控制台上输入了一个有效的整数,scanf 将返回 1,这意味着它分配了一个整数(由于 %d)给 B[0]。这会导致 checker 为 1,因此将在输入第一个数字后立即中断循环。 B[1] 未分配,因此如果您清除了数组,它将包含垃圾或 0。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多