Доброго времени суток! Такие функции, как stoi, atoi, atol, soul, stof, to_string и некоторые другие появились в стандарте C++11 и уже стали привычными. Особенно для пользователей Visual Studio версии 13 года и старше. Но бывают исключительные случаи, когда под рукой нет такого крутого инструмента, а только блокнот и старенький gcc. Либо инструмент есть, но он упорно отказывается работать с C++11.
Именно с такой проблемой я недавно столкнулся. Мне позарез нужно было конвертировать строку в целое число, а мой Eclipse даже через 2 часа шаманствования с бубном так и не стал дружить с функцией stoi. Было принято волевое решение написать свою реализацию преобразования string to int. Я остановился на реализации преобразования целых десятичных положительных и отрицательных чисел, этого вполне хватило.
Функция преобразования string to int на C/C++
Преобразование контейнера string в целое число int задача не самая сложная, особенно учитывая, что я работал только с десятичной системой счисления. Алгоритм простой, бежим по строке, если находим не цифру, ругаемся и возвращаем ноль, остальные цифры умножаем на десятку в нужном порядке и прибавляем к результату. Кроме того, смотрим на первый символ, если там стоит минус, не забываем это учесть.
int my_stoi(string str) {
int num = 0;
int ten;
bool signFlag = true; //true: +, false: -
for(unsigned int i = 0; i < str.length(); i++) {
if(str[i] < '0' || str[i] > '9') {
if(i == 0 && str[i] == '-') {
signFlag = false;
continue;
}
if(i == 0 && str[i] == '+') {
signFlag = true;
continue;
}
return NULL;
}
ten = 1;
for(unsigned int j = 0; j < str.length() - 1 - i; j++) {
ten *= 10;
}
num += ten * (str[i] - '0');
}
if(signFlag) {
return num;
}
else {
return -num;
}
}
Функция преобразования char* to int на C/C++
Преобразование сишной строки в число отличается только тем, что нам самим придется посчитать длину этой строки. Вот вам, кстати, заодно и реализация strlen.
int my_stoi(char* str) {
unsigned int strLen = 0;
unsigned int i = 0;
while(str[i] != '\0') {
strLen += 1;
i++;
}
int num = 0;
int ten;
bool signFlag = true; //true: +, false: -
for(i = 0; i < strLen; i++) {
if(str[i] < '0' || str[i] > '9') {
if(i == 0 && str[i] == '-') {
signFlag = false;
continue;
}
if(i == 0 && str[i] == '+') {
signFlag = true;
continue;
}
return NULL;
}
ten = 1;
for(unsigned int j = 0; j < strLen - 1 - i; j++) {
ten *= 10;
}
num += ten * (str[i] - '0');
}
if(signFlag) {
return num;
}
else {
return -num;
}
}
Заключение
А суть статьи в том, чтобы я в следующий раз не тратил 20 минут на написание stoi, а пришел сюда и скопировал код. Кроме того, возможно кому нибудь пригодится эта реализация для учебных целей, всякое может быть.