【问题标题】:C Array Split By Odd Even Indexes Gives Garbage ValuesC 数组按奇偶索引拆分会产生垃圾值
【发布时间】:2020-02-04 17:46:38
【问题描述】:

在有人将此标记为重复之前,它不是。

所以我有这个数组

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

在 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

此时,我想我在某个地方搞砸了。任何帮助将不胜感激。

【问题讨论】:

  • 近乎普遍的事实:问:“编译器有一些问题”答:“不”
  • a[i] = arr[i]; 应该是 a[aa] = arr[i];bbb 也是如此。并且在printfs 中a[i]b[i] 也会在i 大于2 时越界。(您可能在相应的aabb 中使用printf 并增加@987654338 @ 或bbprintf 之后。)
  • 顺便提一下,if (i == 0 || i % 2 == 0) 可以简化为 if (i % 2 == 0),因为 0 是偶数。
  • @Ian Abbott +1。很好的建议。

标签: c arrays gcc garbage


【解决方案1】:

i 大于2 时,任何对a[i]b[i] 的访问都将超出范围。在填写a[]b[] 时,您应该使用aabb 索引数组。

此外,偶数或奇数索引的测试可以简化,因为 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++;
        }
    }

【讨论】:

  • 本来打算发同样的东西,但你在我之前发了。感谢您的帮助!
【解决方案2】:

你不是说“b[bb] = arr[i];”吗? ?

【讨论】:

  • 这也是一个正确的答案。接受 Ian Abbott 是因为它会让其他人更清楚地理解。
猜你喜欢
  • 2012-09-06
  • 1970-01-01
  • 1970-01-01
  • 2016-12-31
  • 2013-10-09
  • 1970-01-01
  • 2015-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多