Молодогвардейцев 454015 Россия, Челябинская область, город Челябинск 89085842764
MindHalls logo

Реализация преобразования string to int на C/C++

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