Подтвердить что ты не робот

С++ parse int из строки

Возможный дубликат:
Как разбирать строку в int на С++?

Я провел некоторое исследование, и некоторые люди говорят, что используют atio, а другие говорят, что это плохо, и я не могу заставить его работать в любом случае.

Таким образом, я просто хочу спросить, как правильно преобразовать строку в int.

string s = "10";
int i = s....?

Спасибо!

4b9b3361

Ответ 1

  • В С++ 11 используйте std::stoi как:

    std::string s = "10";
    int i = std::stoi(s);
    

    Обратите внимание, что std::stoi генерирует исключение типа std::invalid_argument, если преобразование не может быть выполнено, или std::out_of_range, если преобразование приводит к переполнению (т.е. когда строковое значение слишком велико для типа int). Вы можете использовать std::stol или std:stoll, хотя в case int кажется слишком малым для входной строки.

  • В С++ 03/98 можно использовать любое из следующих:

    std::string s = "10";
    int i;
    
    //approach one
    std::istringstream(s) >> i; //i is 10 after this
    
    //approach two
    sscanf(s.c_str(), "%d", &i); //i is 10 after this
    

Обратите внимание, что вышеприведенные два подхода не будут введены для ввода s = "10jh". Они возвратят 10 вместо уведомления об ошибке. Таким образом, безопасный и надежный подход заключается в том, чтобы написать свою собственную функцию, которая анализирует входную строку и проверяет каждый символ, чтобы проверить, является ли он цифрой или нет, а затем работать соответствующим образом. Вот одна надежная реализация (непроверенная):

int to_int(char const *s)
{
     if ( s == NULL || *s == '\0' )
        throw std::invalid_argument("null or empty string argument");

     bool negate = (s[0] == '-');
     if ( *s == '+' || *s == '-' ) 
         ++s;

     if ( *s == '\0')
        throw std::invalid_argument("sign character only.");

     int result = 0;
     while(*s)
     {
          if ( *s >= '0' && *s <= '9' )
          {
              result = result * 10  - (*s - '0');  //assume negative number
          }
          else
              throw std::invalid_argument("invalid input string");
          ++s;
     }
     return negate ? result : -result; //-result is positive!
} 

Это решение является слегка измененной версией моего другого решения.

Ответ 2

Вы можете использовать boost:: lexical_cast:

#include <iostream>
#include <boost/lexical_cast.hpp>

int main( int argc, char* argv[] ){
std::string s1 = "10";
std::string s2 = "abc";
int i;

   try   {
      i = boost::lexical_cast<int>( s1 );
   }
   catch( boost::bad_lexical_cast & e ){
      std::cout << "Exception caught : " << e.what() << std::endl;
   }

   try   {
      i = boost::lexical_cast<int>( s2 );
   }
   catch( boost::bad_lexical_cast & e ){
      std::cout << "Exception caught : " << e.what() << std::endl;
   }

   return 0;
}

Ответ 3

Нет "правильного пути". Если вы хотите универсальное (но субоптимальное) решение, вы можете использовать boost:: lexical cast.

Общим решением для С++ является использование std:: ostream и < оператор. Вы можете использовать метод stringstream и stringstream:: str() для преобразования в строку.

Если вам действительно нужен быстрый механизм (помните правило 20/80), вы можете искать "выделенное" решение, например http://www.partow.net/programming/strtk/index.html

С наилучшими пожеланиями,
Marcin

Ответ 4

Вы можете использовать istringstream.

string s = "10";

// create an input stream with your string.
istringstream is(str);

int i;
// use is like an input stream
is >> i;

Ответ 5

Некоторые удобные быстрые функции (если вы не используете Boost):

template<typename T>
std::string ToString(const T& v)
{
    std::ostringstream ss;
    ss << v;
    return ss.str();
}

template<typename T>
T FromString(const std::string& str)
{
    std::istringstream ss(str);
    T ret;
    ss >> ret;
    return ret;
}

Пример:

int i = FromString<int>(s);
std::string str = ToString(i);

Работает для любых потоковых типов (поплавков и т.д.). Вам нужно #include <sstream> и, возможно, также #include <string>.