C - printf改变我的输出



我正在尝试解决Hackerrank上的这个挑战。

我遇到了一个问题,我无法继续,但我不知道我错在哪里-我希望这里有人能帮助我。

我目前的解决方案如下:

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: %dtcount: %dn",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()函数,那么我可以看到当前的问题编号和页码,看看它是否"特殊"。如果我不注释它,我的最终输出是8,这就是我想要的。但是我不想把所有的迭代都打印出来。我遇到的问题是,当我删除这一行,或者把它注释掉时,输出变成了5,而不是8。是什么导致了这种变化?

在您的代码中,在定义int t[n];时,您使用未初始化的n。这将调用未定义行为。

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

引用C11, chapter§6.7.9

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

和附录§J。2、未定义行为,

当对象具有自动保存时长时,使用该值不确定的

您需要将int t[n]; 的定义移动到之后,您已经成功地扫描了来自用户的值。检查scanf()的返回值,确保操作成功

数组必须为固定大小您可以在读取元素数n后使用创建calloc (), malloc ()

相关内容

  • 没有找到相关文章

最新更新