Строка C ++ в int без использования atoi () или stoi ()

Привет, я новичок в C ++ и пытаюсь выполнить задание, в котором мы читаем много данных из файла txt в формате

 surname,initial,number1,number2

Я попросил помощи, прежде чем кто-то предложил прочитать 2 значения как строку, а затем использовать stoi () или atoi () для преобразования в int. Это отлично работает, за исключением того, что мне нужно использовать этот параметр «-std = c ++ 11» для компиляции, иначе он вернет ошибку. Это не проблема на моем собственном компьютере, который будет обрабатывать "-std = c ++ 11", но, к сожалению, для меня машины, на которых я должен представить свою программу, не имеют этой опции.

Если есть другой способ преобразовать строку в int, которая не использует stoi или atoi?

Вот мой код.

while (getline(inputFile, line))
{
    stringstream linestream(line);

    getline(linestream, Surname, ',');
    getline(linestream, Initial, ',');
    getline(linestream, strnum1, ',');
    getline(linestream, strnum2, ',');
    number1 = stoi(strnum1);
    number2 = stoi(strnum2);

    dosomethingwith(Surname, Initial, number1, number2);
}

person user2661167    schedule 11.10.2013    source источник
comment
Во-первых, вам не нужно -std=c++11 для atoi. Но я бы избегал atoi, поскольку он не позволяет проверять ошибки. Лучшим решением было бы strtoi.   -  person James Kanze    schedule 11.10.2013
comment
И что это за мания использования stringstream, когда вы хотите istringstream? (Я все время это вижу и не понимаю, зачем кому-то это делать.)   -  person James Kanze    schedule 11.10.2013
comment
Кроме того, вместо istringstream для такого формата я бы использовал что-то вроде boost::split (что по-прежнему оставляет открытым вопрос преобразования в int).   -  person James Kanze    schedule 11.10.2013


Ответы (2)


Я думаю, вы можете написать свою собственную стои-функцию. вот мой код, я его тестировал, он очень простой.

long stoi(const char *s)
{
    long i;
    i = 0;
    while(*s >= '0' && *s <= '9')
    {
        i = i * 10 + (*s - '0');
        s++;
    }
    return i;
}
person wangyang    schedule 11.10.2013
comment
Во-первых, у него не char const*, а std::string. И, во-вторых, таким функциям нужно гораздо больше проверять ошибки, чтобы они были полезны. - person James Kanze; 11.10.2013

Вы уже используете stringstream, который дает вам такую ​​«особенность».

void func()
{
    std::string strnum1("1");
    std::string strnum2("2");
    int number1;
    int number2;
    std::stringstream convert;

    convert << strnum1;
    convert >> number1;

    convert.str(""); // clear the stringstream
    convert.clear(); // clear the state flags for another conversion

    convert << strnum2;
    convert >> number2;
}
person Mateusz Kołodziejski    schedule 11.10.2013
comment
Зачем быть простым, если можно быть сложным? Вам не нужен (и не обязательно нужен) двунаправленный stringstream. Просто используйте istringstream, инициализированный правильной строкой. - person James Kanze; 11.10.2013