生成荒谬的输出

时间:2017-01-04 13:35:23

标签: c io printf output

我编写了以下代码,但它生成了荒谬的输出值。我无法弄清楚代码中的错误。

#include <stdio.h>

int main(void)
{
    int t, n, i, count;
    scanf("%d", &t);

    while(t--)
    {
        scanf("%d", &n);
        long long a[n], limit;

        for(i = 1; i <= n; i++)
            scanf("%lld", &a[i]);

        count = 1;
        limit = a[1];
        for(i = 2; i <= n; i++)
        {
            if(a[i] < limit)
            {
                count++;
                limit = a[i];
            }
        }

        printf("%lld\n", count);
    }

    return 0;
}

INPUT: -

  

3
  1
  10个
  3
  8 3 6
  5
  4 5 1 2 3

输出: -

  

-4621320042389176319
  4615368115365085186个
  -4621320334446952446

请解释我的代码出现的任何问题。

4 个答案:

答案 0 :(得分:4)

至少有两个问题: 首先,在C数组中索引从0开始,而不是1.因此它必须是

    for(i = 0; i < n; i++)
        scanf("%lld", &a[i]);

    count = 1;
    limit = a[0];
    for(i = 1; i < n; i++)
    {
        if(a[i] < limit)
        {
            count++;
            limit = a[i];
        }
    }

其次,您致电printf("%lld\n", count);,但count是'普通国家',因此它应该是printf("%d\n", count);

答案 1 :(得分:2)

我无法重现垃圾输出,但是我看到代码中出现了两次UB,这是因为访问a数组超出界限所致:

for(i = 1; i <= n; i++)
   scanf("%lld", &a[i]);

...和...

for(i = 2; i <= n; i++)
{         
    if(a[i] < limit)
    {
            count++;
            limit = a[i];
    }
}

在第一种情况下,您将重复 [1,n] 范围(其中n包含在内)。在第二种情况下,您将重复 [2,n] 范围(其中n包含在内)

但您的a数组包含n元素,因此其范围为 [0,n),其中n 独占

答案 2 :(得分:1)

鉴于

int count;

此代码

printf("%lld\n", count);

是未定义的行为。

the C Standard,格式说明符"ll"适用于long long int类型:

  

ll(ell-ell)指定以下diouxX   转换说明符适用于long long intunsigned long long int参数;或者以下n转换说明符适用于a   指向long long int参数的指针。

  

如果转换规范无效,则行为为   未定义。

答案 3 :(得分:0)

您在这里使用了错误的长度修改器:

 printf("%lld\n", count);

这样做可以调用未定义的行为,因此可以打印任何内容 - 任何事情都可能发生。

打印intcount是)只使用d而不使用任何长度修饰符。

 printf("%d\n", count);

(或将count定义为long long int,这是lld期望的内容。