为什么我输出的数组是一串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;
}
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;
}
请尝试使用修改后的代码,并确保输入的数组被正确排序。如果还有其他问题,请随时提问。
【相关推荐】