Один из способов может включать передачу длины цифры в качестве аргумента, чтобы мы могли эффективно читать в обратном направлении:
int strtoi(char *c, size_t l)
{
return l ? c[l-1] - '0' + 10 * strtoi(c, l - 1) : 0;
}
Тогда назовите это так:
int i = strtoi("432", 3);
Или:
char *c = "432";
int i = strtoi(c, strlen(c));
Но не всегда оптимально беспокоиться о длине строки. Кроме того, если строка содержит символы после числа, мы должны были бы учесть это вручную, потому что эта функция не сделает это за нас. Мы не можем (не должны) использовать strlen()
внутри нашей функции, чтобы избежать необходимости передавать аргументы, потому что это может привести к значительному замедлению, чтобы каждый раз пересчитывать длину строки. Наверняка должен быть способ сделать это с самого начала, даже если мы должны вывести тяжелую артиллерию:
int strtoi(char *c)
{
if(!isdigit(*c)) return 0;
int i = strtoi(c + 1);
return i + pow(10, (int)(log(i + 1)/log(10)) + (i != 0)) * (*c - '0');
}
И нет, это (int)
приведение не является обязательным. По сути, вся эта математика вычисляет степень 10, на которую мы должны умножить нашу текущую цифру, на основе числа, возвращенного последним рекурсивным вызовом.
Я понимаю, что это, вероятно, учебное упражнение, но рекурсия - это не главное, а конец всего программирования. На некоторых языках и для некоторых задач это то, что некоторые, в том числе и я, назвали бы красивым, но, судя по всему, это не один из таких случаев.