У меня была аналогичная проблема и с доменом cookie:
ini_set('session.cookie_domain', '.domain.com');
домен был настроен неправильно, поэтому все сеансы были проигнорированы, потому что пользовательский файл cookie никогда не устанавливался правильно, надеюсь, что это поможет кому-то.
Начну с очевидного: уже есть библиотечная функция, которая может преобразовывать строку, содержащую число в любом основании от (я полагаю) 2 до 36:
printf("%ld\n", strtol("1A", NULL, 20));
// Output: 30
Если, однако, в рамках выполнения задания или домашнего задания использование этой и аналогичных библиотечных функций запрещено, я не буду выполнять за вас домашнее задание, но вместо этого я дам вам описание алгоритма высокого уровня для чтения целого числа в произвольной основе, N:
accumulator
в ноль. i
в 0
. accumulator
на N. str[i]
, и добавьте ее к accumulator
(ваша функция val
). i
. str[i]
равно '\0'
, верните accumulator
и выйдите. В противном случае перейдите к шагу 3. В вашем коде я вижу две ключевые проблемы:
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;
}