按奇偶索引拆分的 C 数组得到垃圾值
C Array Split By Odd Even Indexes Gives Garbage Values
在任何人将此标记为重复之前,它不是。
所以我有这个数组
int arr[6];
我想根据索引将它分成两个不同的数组。现在这是我的程序:
#include <stdio.h>
int main()
{
int arr[6], a[3], b[3], i, j, n, aa = 0, bb = 0;
printf("How many elements ? \n");
scanf("%d", &n);
printf("Enter the numbers : \n");
for (i = 0; i < n; i++)
scanf("%d", &arr[i]);
for (i = 0; i < n; i++)
{
if (i == 0 || i % 2 == 0)
{
// even
a[i] = arr[i];
aa++;
// For debug purpose
printf("a[%d]=%d, arr[%d]=%d, aa=%d\n", i, a[i], i, arr[i], aa);
}
else
{
// odd
b[i] = arr[i];
bb++;
// For debug purpose
printf("b[%d]=%d, arr[%d]=%d, bb=%d\n", i, b[i], i, arr[i], bb);
}
}
// For debug purpose
printf("aa=%d bb=%d n=%d\n", aa, bb, n);
printf("THE NUMBERS are :\n");
for (i = 0; i < aa; i++)
printf("%d ", a[i]);
printf("\n");
for (i = 0; i < bb; i++)
printf("%d ", b[i]);
printf("\n");
}
问题是,我得到的是垃圾值作为输出。当调试日志显示一切正常时,这甚至没有任何意义。
kogam22@HOME-PC:~$ gcc test.c && ./a.out
How many elements ?
6
Enter the numbers :
2 3 4 5 6 7
a[0]=2, arr[0]=2, aa=1
b[1]=3, arr[1]=3, bb=1
a[2]=4, arr[2]=4, aa=2
b[3]=5, arr[3]=5, bb=2
a[4]=6, arr[4]=6, aa=3
b[5]=7, arr[5]=7, bb=3
aa=3 bb=3 n=6
THE NUMBERS are :
2 32616 4
32616 6 0
我曾尝试在 运行 时间之前直接给程序输入,但这也行不通。
int arr[6] = {2, 3, 4, 5, 6, 7};
int a[3], b[3];
int aa = 0, bb = 0, n = 6;
int i, j;
我想知道,是我的程序有问题,还是编译器有问题。我也会用 clang 编译器试试这个。
此外,代码在 repl.it 上可用,任何人都可以 运行 并检查。 https://repl.it/@Kogam22/CArrayIndexOddEven
运行 on clang 也给出垃圾值。
clang version 7.0.0-3~ubuntu0.18.04.1 (tags/RELEASE_700/final)
clang-7 -pthread -lm -o main main.c
./main
How many elements ?
6
Enter the numbers :
2 3 4 5 6 7
a[0]=2, arr[0]=2, aa=1
b[1]=3, arr[1]=3, bb=1
a[2]=4, arr[2]=4, aa=2
b[3]=5, arr[3]=5, bb=2
a[4]=6, arr[4]=6, aa=3
b[5]=7, arr[5]=7, bb=3
aa=3 bb=3 n=6
THE NUMBERS are :
5 0 7
4196381 3 1771501984
在这一点上,我想我在某个地方搞砸了。任何帮助将不胜感激。
你不是说 "b[bb] = arr[i];" 吗?
当 i
大于 2 时,对 a[i]
或 b[i]
的任何访问都将越界。您应该使用 aa
和 bb
填充 a[]
和 b[]
数组时的索引。
此外,由于 0 是偶数,因此可以简化对偶数或奇数索引的测试。
这里是数组拆分循环的固定版本:
for (i = 0; i < n; i++)
{
if (i % 2 == 0)
{
// even
a[aa] = arr[i];
// For debug purpose
printf("a[%d]=%d, arr[%d]=%d, aa=%d\n", aa, a[aa], i, arr[i], aa);
aa++;
}
else
{
// odd
b[bb] = arr[i];
// For debug purpose
printf("b[%d]=%d, arr[%d]=%d, bb=%d\n", bb, b[bb], i, arr[i], bb);
bb++;
}
}
在任何人将此标记为重复之前,它不是。
所以我有这个数组
int arr[6];
我想根据索引将它分成两个不同的数组。现在这是我的程序:
#include <stdio.h>
int main()
{
int arr[6], a[3], b[3], i, j, n, aa = 0, bb = 0;
printf("How many elements ? \n");
scanf("%d", &n);
printf("Enter the numbers : \n");
for (i = 0; i < n; i++)
scanf("%d", &arr[i]);
for (i = 0; i < n; i++)
{
if (i == 0 || i % 2 == 0)
{
// even
a[i] = arr[i];
aa++;
// For debug purpose
printf("a[%d]=%d, arr[%d]=%d, aa=%d\n", i, a[i], i, arr[i], aa);
}
else
{
// odd
b[i] = arr[i];
bb++;
// For debug purpose
printf("b[%d]=%d, arr[%d]=%d, bb=%d\n", i, b[i], i, arr[i], bb);
}
}
// For debug purpose
printf("aa=%d bb=%d n=%d\n", aa, bb, n);
printf("THE NUMBERS are :\n");
for (i = 0; i < aa; i++)
printf("%d ", a[i]);
printf("\n");
for (i = 0; i < bb; i++)
printf("%d ", b[i]);
printf("\n");
}
问题是,我得到的是垃圾值作为输出。当调试日志显示一切正常时,这甚至没有任何意义。
kogam22@HOME-PC:~$ gcc test.c && ./a.out
How many elements ?
6
Enter the numbers :
2 3 4 5 6 7
a[0]=2, arr[0]=2, aa=1
b[1]=3, arr[1]=3, bb=1
a[2]=4, arr[2]=4, aa=2
b[3]=5, arr[3]=5, bb=2
a[4]=6, arr[4]=6, aa=3
b[5]=7, arr[5]=7, bb=3
aa=3 bb=3 n=6
THE NUMBERS are :
2 32616 4
32616 6 0
我曾尝试在 运行 时间之前直接给程序输入,但这也行不通。
int arr[6] = {2, 3, 4, 5, 6, 7};
int a[3], b[3];
int aa = 0, bb = 0, n = 6;
int i, j;
我想知道,是我的程序有问题,还是编译器有问题。我也会用 clang 编译器试试这个。
此外,代码在 repl.it 上可用,任何人都可以 运行 并检查。 https://repl.it/@Kogam22/CArrayIndexOddEven
运行 on clang 也给出垃圾值。
clang version 7.0.0-3~ubuntu0.18.04.1 (tags/RELEASE_700/final)
clang-7 -pthread -lm -o main main.c
./main
How many elements ?
6
Enter the numbers :
2 3 4 5 6 7
a[0]=2, arr[0]=2, aa=1
b[1]=3, arr[1]=3, bb=1
a[2]=4, arr[2]=4, aa=2
b[3]=5, arr[3]=5, bb=2
a[4]=6, arr[4]=6, aa=3
b[5]=7, arr[5]=7, bb=3
aa=3 bb=3 n=6
THE NUMBERS are :
5 0 7
4196381 3 1771501984
在这一点上,我想我在某个地方搞砸了。任何帮助将不胜感激。
你不是说 "b[bb] = arr[i];" 吗?
当 i
大于 2 时,对 a[i]
或 b[i]
的任何访问都将越界。您应该使用 aa
和 bb
填充 a[]
和 b[]
数组时的索引。
此外,由于 0 是偶数,因此可以简化对偶数或奇数索引的测试。
这里是数组拆分循环的固定版本:
for (i = 0; i < n; i++)
{
if (i % 2 == 0)
{
// even
a[aa] = arr[i];
// For debug purpose
printf("a[%d]=%d, arr[%d]=%d, aa=%d\n", aa, a[aa], i, arr[i], aa);
aa++;
}
else
{
// odd
b[bb] = arr[i];
// For debug purpose
printf("b[%d]=%d, arr[%d]=%d, bb=%d\n", bb, b[bb], i, arr[i], bb);
bb++;
}
}