冒泡排序数组的输出问题

为什么我输出的数组是一串000000?


#include<stdio.h>
#include<string.h>
void maopao(int arr[], int sz) {
    for (int a = 0; a < sz - 1; a++) {
        for (int b = 0; b < sz - 1 - a; b++) {
            if (arr[b] > arr[b + 1]) {
                int temp = arr[b];
                arr[b] = arr[b + 1];
                arr[b + 1] = temp;
            }
        }
    }
}
int main()
{
    int n;
    int arr[100] = { 0 };
    while(~scanf("%d", &n)) {
        if (n == 0) {
            break;
        }
        memset(arr, 0, sizeof(arr));
        int j = 0;
        for (int i = 1; i <= n; i++) {
            int d;
            scanf("%d", &d);
            arr[j] = d;
            j++;
        }
        int sz = sizeof(arr) / sizeof(arr[0]);
        maopao(arr, sz);
        for (int c = 0; c < n; c++) {
            printf("%d ", arr[c]);
        }
        printf("\n");
    }
    return 0;
}

第18行:定义的是静态数组 int arr[100]; 它的大小已经固定了 100,所以第31行里 int sz = sizeof(arr) / sizeof(arr[0]); 得到 sz = 100,不管实际输入几个元素,经过 maopao(arr, sz); 函数调用,输入的数字元素就被排序到最末尾,所以第33行里改为for (int c = 0; c < 100; c++) 就可以看到输入的数字了。
修改如下,可以运行下看看,供参考:

#include<stdio.h>
#include<string.h>
void maopao(int arr[], int sz) {
    for (int a = 0; a < sz - 1; a++) {
        for (int b = 0; b < sz - 1 - a; b++) {
            if (arr[b] > arr[b + 1]) {
                int temp = arr[b];
                arr[b] = arr[b + 1];
                arr[b + 1] = temp;
            }
        }
    }
}
int main()
{
    int n;
    int arr[100] = { 0 };  //定义的数组已经是固定的元素个数:100
    while(~scanf("%d", &n)) {
        if (n == 0) {
            break;
        }
        memset(arr, 0, sizeof(arr));
        int j = 0;
        for (int i = 1; i <= n; i++) {
            int d;
            scanf("%d", &d);
            arr[j] = d;
            j++;
        }
        int sz = sizeof(arr) / sizeof(arr[0]); // 这里: sz = 100
        maopao(arr, sz);
        for (int c = 0; c < sz; c++) { //for (int c = 0; c < n; c++)
            printf("%d ", arr[c]);      //修改为输出 100 元素,就可以看到输入的元素了。
        }
        printf("\n");
    }
    return 0;
}

img

while(~scanf("%d", &n))
->
while(scanf("%d", &n) != EOF)
用ctrl+z结束输入

【以下回答由 GPT 生成】

回答:

问题解决的原因是在每次输入新的数组之前,您使用memset(arr, 0, sizeof(arr))将数组arr中的所有元素都设置为0。这样做会导致在输入新的数组时,已经排序好的数组元素被覆盖为0,从而导致输出结果全为0。

为了修复这个问题,您可以将memset(arr, 0, sizeof(arr))这一行代码移动到while循环的外部,在第一次循环之前执行。这样可以确保只在初始化数组时将所有元素设置为0,而不会在每次输入新的数组时重新设置。

修改后的代码如下:

#include <stdio.h>
#include <string.h>

void maopao(int arr[], int sz) {
    for (int a = 0; a < sz - 1; a++) {
        for (int b = 0; b < sz - 1 - a; b++) {
            if (arr[b] > arr[b + 1]) {
                int temp = arr[b];
                arr[b] = arr[b + 1];
                arr[b + 1] = temp;
            }
        }
    }
}

int main()
{
    int n;
    int arr[100] = { 0 };
    memset(arr, 0, sizeof(arr)); // 将初始化数组部分移到 while 循环之前
    while (~scanf("%d", &n)) {
        if (n == 0) {
            break;
        }
        int j = 0;
        for (int i = 1; i <= n; i++) {
            int d;
            scanf("%d", &d);
            arr[j] = d;
            j++;
        }
        int sz = sizeof(arr) / sizeof(arr[0]);
        maopao(arr, sz);
        for (int c = 0; c < n; c++) {
            printf("%d ", arr[c]);
        }
        printf("\n");
    }
    return 0;
}

请尝试使用修改后的代码,并确保输入的数组被正确排序。如果还有其他问题,请随时提问。



【相关推荐】



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