Как преобразовать строку C ++ в int?

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

Как преобразовать строку C ++ в int?

Предположим, вы ожидаете, что строка будет содержать реальные числа (например, «1», «345», «38944»).

Кроме того, предположим, что у вас нет boost, и вы действительно хотите сделать это способом C ++, а не старым хитрым способом C.


person krupan    schedule 14.10.2008    source источник
comment
Как насчет некоторых примеров из следующего: codeproject.com/KB/recipes/Tokenizer. aspx Они очень эффективны и несколько элегантны.   -  person    schedule 04.11.2010


Ответы (8)


Используйте потоки C ++.

std::string       plop("123");
std::stringstream str(plop);
int x;

str >> x;

/* Lets not forget to error checking */
if (!str)
{
     // The conversion failed.
     // Need to do something here.
     // Maybe throw an exception
}

PS. Этот основной принцип - как работает библиотека повышения lexical_cast<>.

Мой любимый метод - буст lexical_cast<>

#include <boost/lexical_cast.hpp>

int x = boost::lexical_cast<int>("123");

Он предоставляет метод преобразования между строковым и числовым форматами и обратно. Под ним используется строковый поток, поэтому все, что может быть маршалировано в поток, а затем де-маршалировано из потока (обратите внимание на операторы >> и ‹<).

person Martin York    schedule 14.10.2008
comment
разве не должно быть, если (! x) ...? - person Svante; 20.11.2008
comment
Нет. Если оператору потока не удается извлечь число из str, он устанавливает плохой бит. Использование этого в логическом контексте (как указано выше) будет проверять, в порядке ли поток, возвращая объект, который можно преобразовать в bool. Если бы я проверил «x», то он потерпел бы неудачу, если значение, помещенное в «x», равно 0. Если поток не смог извлечь что-либо, значение «x» не определено. - person Martin York; 17.04.2009
comment
Он устанавливает бит fail, а не бит bad. оператор! является синонимом функции fail (). - person scai; 01.08.2012

Раньше я использовал что-то вроде следующего в коде C ++:

#include <sstream>
int main()
{
    char* str = "1234";
    std::stringstream s_str( str );
    int i;
    s_str >> i;
}
person ayaz    schedule 14.10.2008
comment
В ПОРЯДКЕ. Кто-то уже предлагал это, поэтому я повысил их. - person ayaz; 14.10.2008

C ++ FAQ Lite

[39.2] Как преобразовать std :: string в число?

https://isocpp.org/wiki/faq/misc-technical-issues#convert-string-to-num

person Alessandro Jacopson    schedule 15.10.2008
comment
лучший подход, imho, особенно с настраиваемым fail_on_leftover - person Eli Bendersky; 08.05.2010
comment
Что такое fail_on_leftover? - person Alessandro Jacopson; 24.06.2010

Разрешите добавить свой голос за boost :: lexical_cast

#include <boost/lexical_cast.hpp>

int val = boost::lexical_cast<int>(strval) ;

Выдает bad_lexical_cast при ошибке.

person Ryan Ginstrom    schedule 20.11.2008

Используйте atoi.

person Ramesh Soni    schedule 14.10.2008
comment
Не особо C ++, не так ли? Даже std :: atoi на самом деле не C ++ ... - person graham.reeds; 26.10.2008
comment
atoi () выполняет другую магию ... например, игнорирует начальные пробелы, игнорирует конечные непробельные символы и предполагает, что 0 также является допустимым условием ошибки. Пожалуйста, используйте atoi () только тогда, когда вас действительно не заботит валидность. В противном случае - strtod () в C и std :: istringstream в C ++. - person Tom Barta; 20.11.2008

Возможно, я неправильно понимаю вопрос, почему именно вы не хотите использовать atoi? Не вижу смысла изобретать велосипед.

Я просто упускаю из виду здесь суть?

person user12576    schedule 14.10.2008
comment
На странице руководства для atoi () говорится: Функция atoi () входит в состав strtol (), но сохраняется, поскольку она широко используется в существующем коде. Если известно, что число не находится в диапазоне, следует использовать strtol (), потому что atoi () не требуется для выполнения какой-либо проверки ошибок. - person krupan; 14.10.2008
comment
Я думал, что atoi () был нестандартным, поэтому доступен не везде. Хотя может ошибаться. - person Martin York; 14.10.2008
comment
Отличный момент, Крупан. Признаюсь, я не думал об этом. - person user12576; 15.10.2008
comment
atoi () также игнорирует начальные пробелы и завершающую хрень, поэтому она может быть успешной там, где другие более строгие парсеры потерпят неудачу. В зависимости от вашей точки зрения это может быть преимуществом или препятствием. - person Tom Barta; 20.11.2008

в "stdapi.h"

StrToInt

Эта функция сообщает вам результат и количество символов, участвовавших в преобразовании.

person user27732    schedule 14.10.2008
comment
Хм? Поиск в Google для этого stdapi.h ничего не дает. Вы имеете в виду shlwapi.h (который специфичен для Windows, является частью DLL оболочки и эквивалентен старым хитрым способам на языке C)? - person bk1e; 14.10.2008

person    schedule
comment
Что делать, если произошла ошибка? Скажем, в строке нет числа (привет! Вместо 5). - person krupan; 14.10.2008
comment
Затем вы проверяете наличие ошибки: (stringstream (st) ›› результат)? cout ‹---------------- результат: cerr ‹< Вы проиграли; - person Robᵩ; 14.10.2008