printf改变我的输出

时间:2016-09-01 10:04:54

标签: c arrays loops printf variable-length-array

Hackerrank上的

http://extjs.dariofilkovic.com/

我遇到了无法解决的问题,但我无法看到我出错的地方 - 而且我希望有人可以提供帮助。

我目前的解决方案如下:

int main() {

    int n,k,p,count,total; 
    int t[n];
    scanf("%d %d",&n,&k);
    for(int i = 0; i < n; i++){
        scanf("%d",&t[i]);
    }
    p = 1;
    total=0;
    for(int x = 0; x < n; x++){
        for(int j = 1; j <= t[x]; j++, count++){
            if(count>k){
                count = 1;
                p++;
            }
            if(j==p){
                total++;
            }
            //printf("j: %d p: %d\tcount: %d\n",j,p,count);
        }
        p++;
        count=1;
    }
    printf("%d",total);

    return 0;
}

我已经注释掉的printf改变了我的最终输出。 例如,输入:

  

10 5

     

3 8 15 11 14 1 9 2 24 31

我应该得到8的回答。如果我取消评论printf()功能,那么我可以看到当前的问题编号和页码,看看它是否特殊&# 39 ;. 如果我把它留下未注释,我的最终输出是8,这就是我想要的。但我也不希望打印出所有的迭代。 我遇到的问题是当我删除该行或将其注释掉时,输出变为5而不是8。 是什么导致这种变化?

2 个答案:

答案 0 :(得分:4)

在您的代码中,在定义int t[n];时,您使用n未初始化。那,调用undefined behavior

详细说明,n是一个未自动初始化的自动局部变量,因此该变量的内容是不确定的。尝试使用不确定的值会导致UB。

引用C11,章节§6.7.9

  

如果没有显式初始化具有自动存储持续时间的对象,则其值为   不定。 [...]

和附件§J.2,未定义的行为,

  

使用具有自动存储持续时间的对象的值   不确定

您需要在成功扫描用户的值后移动int t[n]; 的定义。检查scanf()的返回值以确保成功。

答案 1 :(得分:0)

数组必须是固定大小的  您可以在读取元素数n后使用  释放calloc(),的malloc()