【问题标题】:printf changes my outputprintf 改变了我的输出
【发布时间】:2017-01-09 03:55:05
【问题描述】:

I'm trying to solve this challenge 在 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: %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() 函数,那么我可以查看当前问题编号和页码以查看它是否“特殊”。 如果我不加注释,我的最终输出是 8,这就是我想要的。但我不希望所有的迭代都打印出来。 我遇到的问题是,当我删除该行或将其注释掉时,输出变为 5,而不是 8。 是什么导致这种情况发生变化?

【问题讨论】:

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


    【解决方案1】:

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

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

    引用C11,第 6.7.9 章

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-17
        • 1970-01-01
        • 2012-11-06
        • 2017-11-20
        • 2022-01-12
        • 1970-01-01
        • 1970-01-01
        • 2012-06-12
        相关资源
        最近更新 更多