Элементы одномерного массива в C не отображаются после определенного индекса - PullRequest
0 голосов
/ 26 апреля 2019

Я новичок в C и пишу программу, которая в основном преобразует десятичное число в основание 6, но числа за пятой позицией не отображаются.Когда я ввожу 56400 в качестве числа, которое я хочу преобразовать, вывод программы будет 13040 вместо 1113040, что является правильным ответом.

Я вспомнил, как java использует массивы, поэтому я гуглил способ созданиямассив динамического размера.Я обнаружил, что используя alloc и malloc, я практически никогда не мог исчерпать пространство для моего массива.Я не очень понимал это, потому что я не видел указателей и всего этого джаза и, в конце концов, не знал, как это реализовать.Поэтому я решил попробовать разные вещи:

Первое: сам алгоритм не может быть и речи.Он может показывать число, число цифр которого не превышает 5, и, пробуя его самостоятельно, он в основном дает правильный ответ.Второе: я попытался определить размер массива, чтобы узнать, в этом ли проблема.Таким образом, я определил, что мой массив состоит из 8 элементов, и в результате получилось, что если мое десятичное число дает основание 6, которое содержит 8 цифр, то число показывает правильное значение, если нет, то оно дает действительно странные числа, такие как -7600 или -2 миллиона-что-то.

Вот код: мой основной метод и моя функция, которая преобразует числа в основание 6, где, как мне кажется, проблема.

/*Translations:
residuo: remainder
division: quotient of a division
adicion: sum, addition
numeroBase6: my number in base 6*/
int toBase6(int number) {
    int division = number;
    int residuo;
    int y = 1;
    int numeroBase6[y];
    int adicion = 0;
    int numSix = 0;

    residuo = division % 6;
    division = division / 6;
    numeroBase6[0] = residuo;
    while(division > 0) {
        residuo = division % 6;
        division = division / 6;
        if(division >= 0){ 
            numeroBase6[y] = residuo;
            y++;
        }else {
            numeroBase6[y] = division;
        }
    }

    for(int x = 0; x <= sizeof numeroBase6; x++) {
        adicion = numeroBase6[x] * pow(10, x);
        numSix += adicion;
    }
    return numSix;
}

Мой основной метод:

        int num1;
    int resultado;

    printf("Escriba un numero en decimal: "); //Print "Write your decimal number"
    scanf("%d", &num1);
    resultado = toBase6(num1);
    printf("\nNumero en base 6 es: %d\n", resultado); //Print "Your number in base 6 is: "

Итак, я хочу знать, что я могу сделать, чтобы показать массив чисел больше 5?

1 Ответ

1 голос
/ 26 апреля 2019

Когда вы делаете это:

int y = 1;
int numeroBase6[y];

Вы создаете массив размером 1, и этот массив будет всегда . Размер не изменяется только потому, что значение y изменяется. В результате вы пишете после конца массива с каждой цифрой после первой. Это вызывает неопределенное поведение .

Число 6-значных базовых цифр не должно превышать удвоенного количества цифр 10-значного базового числа, а 32-разрядное целое число имеет не более 10 десятичных цифр, поэтому просто определите в своем массиве 25 элементов. Этого должно быть достаточно, чтобы охватить все возможные значения.

int numeroBase6[25];

Кроме того, если вы попытаетесь закодировать десятичное число вашего базового числа 6 следующим образом:

for(int x = 0; x <= sizeof numeroBase6; x++) {
    adicion = numeroBase6[x] * pow(10, x);
    numSix += adicion;
}
return numSix;

Возможно, вы переполните то, что может удержать int. Вместо этого создайте строковое представление напрямую и верните строку.

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