Два ключевых вопроса, которые я вижу в вашем коде:
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;
}