Преобразование базы 20 в int

У меня была аналогичная проблема и с доменом cookie:

    ini_set('session.cookie_domain', '.domain.com');

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

0
задан cdlane 5 March 2019 в 18:22
поделиться

2 ответа

Начну с очевидного: уже есть библиотечная функция, которая может преобразовывать строку, содержащую число в любом основании от (я полагаю) 2 до 36:

printf("%ld\n", strtol("1A", NULL, 20));
// Output: 30

Если, однако, в рамках выполнения задания или домашнего задания использование этой и аналогичных библиотечных функций запрещено, я не буду выполнять за вас домашнее задание, но вместо этого я дам вам описание алгоритма высокого уровня для чтения целого числа в произвольной основе, N:

  1. Инициализировать переменную accumulator в ноль.
  2. Инициализировать переменную счета i в 0.
  3. Умножьте accumulator на N.
  4. Получите числовое значение цифры base-N, находящейся на данный момент в str[i], и добавьте ее к accumulator (ваша функция val).
  5. Увеличение i.
  6. Если str[i] равно '\0', верните accumulator и выйдите. В противном случае перейдите к шагу 3.
0
ответ дан Govind Parmar 5 March 2019 в 18:22
поделиться

В вашем коде я вижу две ключевые проблемы:

void itov(char vigesimalStr[])
// ...
    return -1;

Функция itov() не может быть void, если она возвращает -1 при ошибке. Он также не может вернуть правильное значение в случае успеха!

for (int j = length; j >= 0; j--)

При запуске последовательности в обратном направлении вы хотите начать с length - 1, так как само length никогда не является допустимым индексом, поскольку это последний индекс плюс один.

Ниже доработка вашего кода с устранением вышеуказанных проблем и устранением других мелких проблем:

#include <stdio.h>
#include <stdlib.h>

#define BASE 20

int val(char c)
{
    if ('0' <= c && c <= '9')
        return c - '0';

    return c - 'A' + 10;
}

int itov(char vigesimalStr[])
{
    int length = 0;

    for (length = 0; vigesimalStr[length] != '\0'; length++)
    {
        // nothing to see here
    }

    int power = 1;
    int number = 0;

    for (int j = length - 1; j >= 0; j--)
    {
        int digit = val(vigesimalStr[j]);

        if (digit >= BASE)
        {
            fprintf(stderr, "Invalid Number\n");
            return -1;
        }

        number += digit * power;
        power *= BASE;
    }

    return number;
}

int main()
{
    char to_convert[20] = "1A";

    printf("%d\n", itov(to_convert));

    return 0;
}
0
ответ дан cdlane 5 March 2019 в 18:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: