Доброго времени суток! Такие функции, как 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, а пришел сюда и скопировал код. Кроме того, возможно кому нибудь пригодится эта реализация для учебных целей, всякое может быть.