Я пытаюсь реализовать очень простую strtoi
функцию. Он прекрасно работает, когда переданные аргументы создаются динамически (случай 2 ниже). Однако, если символ создается с помощью char[]
, который выделяется во время компиляции, я получаю постоянное значение на len
из-за std::strlen(ch)
, которое портит мои логики c, и я не могу найти решение для это.
int strtoi(char* ch)
{
int sum {0};
int len = static_cast<int>(std::strlen(ch));
int skipLast = static_cast<int>(static_cast<int>(ch[0]) == 45);
//Integer Method
for(int i = len - 1; i >= 0 + skipLast; i--)
{
if(static_cast<int>(ch[i]) < 48 || static_cast<int>(ch[i]) > 57)
return 0;
sum += (ch[i]-48) * std::pow(10,i-skipLast);
}
sum = skipLast == 1 ? -sum : sum;
return sum;
}
int main()
{
char pos[3] {'1','2','3'};
std::cout << strtoi(pos) << std::endl;
char neg[4] {'-','1','2','3'};
std::cout << strtoi(neg) << std::endl;
return 0;
}
Возвращает: 0
и -123
. Переменная len
в моей функции не получает ожидаемое значение для первого вызова, и я предполагаю, что это потому, что neg[4]
выделяет больше памяти, чем pos[3]
. Однако для второго случая:
int main()
{
char* pos;
pos = new char[3] {'1','2','3'};
std::cout << strtoi(pos) << std::endl;
char* neg;
neg = new char[4] {'-','1','2','3'};
std::cout << strtoi(neg) << std::endl;
return 0;
}
Возвращает 123
, -123
. Ожидаемый результат. Я предполагаю, что это происходит потому, что в первом случае компилятор выделяет память для функции и ее аргумента в соответствии с массивом char[4]
. Это правильно? Как это работает во втором случае, как компилятор выделяет память функции для динамических переменных c? И какое возможное решение заставить функцию работать в обоих случаях? Заранее спасибо за любую помощь.