C Массив, разделенный по нечетным четным индексам, дает значения мусора - PullRequest
1 голос
/ 04 февраля 2020

Прежде чем кто-либо пометит это как Дубликат, это не так.

Итак, у меня есть этот массив

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

На данный момент, я думаю, что я где-то облажался. Любая помощь будет оценена.

Ответы [ 2 ]

2 голосов
/ 04 февраля 2020

Любой доступ к a[i] или b[i] будет выходить за пределы, когда i больше 2. Вы должны использовать индексы aa и bb при заполнении a[] и b[] массивы.

Кроме того, тест на четные или нечетные индексы можно упростить, поскольку равен четному 0.

Вот фиксированная версия разбиения массива l oop:

    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 голосов
/ 04 февраля 2020

Разве вы не имеете в виду "b [bb] = arr [i];"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...