sun-rise- 2023-11-19 17:17 采纳率: 78.6%
浏览 4

程序纠错(C语言习题PTA平台)

请问程序是哪里出了问题,为什么最后乱码了?

img

img

#include <stdio.h>
int main()
{
    int n,i=1,j,post,t;
    scanf("%d",&n);
    int a[n+1];
    int m=n;
    while(m/10>0){
        a[i]=m%10;
        m=m/10;
        i++;
    }
    a[i]=m;
        for(i=1;i<=n-1;i++){
        post=i;
        for(j=i+1;j<=n;j++)
            if(a[j]>a[post]) post=j;
        if(post!=i)
            {t=a[i];a[i]=a[post];a[post]=t;}
    }
    for(i=1;i<=n;i++)
    {
        if(a[i]!=a[i+1])
        printf("%d",a[i]);
    }
    return 0;
}

经过调试发现,程序卡在第二个for循环,无法跳出来

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-19 20:51
    关注

    【以下回答由 GPT 生成】

    问题分析:

    在这段代码中,主要问题在于对数组a的访问越界导致乱码。具体原因是数组a的长度为n+1,而数组下标从1开始,最大下标为n。然而,在第二个for循环中的条件判断i <= n-1是错误的,应该改为i < n。这样的错误导致了在最后一个元素输出时会访问到数组a的越界元素,从而导致了乱码的输出。

    可能的解决方案:

    1.将第二个for循环的条件判断改为i < n,确保不会访问到数组a的越界元素。

    修改后的代码如下所示:

    #include <stdio.h>
    
    int main()
    {
        int n, i = 1, j, post, t;
        scanf("%d", &n);
        int a[n+1];
        int m = n;
        while(m/10 > 0){
            a[i] = m%10;
            m = m/10;
            i++;
        }
        a[i] = m;
        for(i = 1; i < n; i++){  // 修改条件判断
            post = i;
            for(j = i+1;j <= n; j++)
                if(a[j] > a[post]) post = j;
            if(post != i)
                {
                t = a[i]; a[i] = a[post]; a[post] = t;
                }
        }
        for(i = 1; i <= n; i++){
            if(a[i] != a[i+1])
            printf("%d", a[i]);
        }
        return 0;
    }
    

    这样修改后的代码应该能够正确输出排序后的数组元素,而不会出现乱码的情况。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 修改了问题 11月20日
  • 创建了问题 11月19日