Possible Duplicate:
How to parse a string to an int in C++?
Как преобразовать строку C++ в int?
Предположим, вы ожидаете, что строка будет содержать реальные числа (например, «1», «345», «38944»).
Кроме того, предположим, что у вас нет boost, и вы действительно хотите сделать это способом C++, а не старым хитрым способом C.





Используйте потоки 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");
Он предоставляет метод преобразования между строковым и числовым форматами и обратно. Под ним используется строковый поток, поэтому все, что может быть маршалировано в поток, а затем де-маршалировано из потока (взгляните на операторы >> и <<).
разве это не должно быть "если (! x) ..."?
Нет. Если оператору потока не удается извлечь число из str, он устанавливает плохой бит. Использование этого в логическом контексте (как указано выше) будет проверять, в порядке ли поток, возвращая объект, который можно преобразовать в bool. Если бы я проверил «x», то он потерпел бы неудачу, если значение, помещенное в «x», равно 0. Если поток не смог извлечь что-либо, значение «x» не определено.
Он устанавливает бит провал, а не бит плохой. оператор! является синонимом функции fail ().
Используйте атой
Не особо C++, не так ли? Даже std :: atoi на самом деле не C++ ...
atoi () выполняет другую магию ... например, игнорирует начальные пробелы, игнорирует конечные непробельные символы и предполагает, что "0" также является допустимым условием ошибки. Пожалуйста, используйте atoi () только тогда, когда вас действительно не заботит валидность. В противном случае strtod () в C и std :: istringstream в C++.
#include <sstream>
// st is input string
int result;
stringstream(st) >> result;
Что делать, если произошла ошибка? Скажем, в строке нет числа («привет!» Вместо «5»).
Затем вы проверяете наличие ошибки: (stringstream (st) >> result)? cout << result: cerr << "Вы проиграли";
в "stdapi.h"
StrToInt
Эта функция сообщает вам результат и количество символов, участвовавших в преобразовании.
Хм? Поиск в Google для этого "stdapi.h" ничего не дает. Вы имеете в виду "shlwapi.h" (который относится к Windows, является частью DLL оболочки и эквивалентен старым хитрым способам на языке Си)?
Раньше я использовал что-то вроде следующего в коде C++:
#include <sstream>
int main()
{
char* str = "1234";
std::stringstream s_str( str );
int i;
s_str >> i;
}
В ПОРЯДКЕ. Кто-то уже предлагал это, поэтому я повысил их.
Возможно, я неправильно понимаю вопрос, почему именно нет захочет использовать атой? Не вижу смысла изобретать велосипед.
Я просто упустил суть?
На странице руководства для atoi () говорится: «Функция atoi () входит в состав strtol (), но сохраняется, поскольку она широко используется в существующем коде. Если число неизвестно, находится в диапазоне, следует использовать strtol (). потому что atoi () не требуется для проверки ошибок ".
Я думал, что atoi () был нестандартным, поэтому доступен не везде. Хотя может ошибаться.
Отличный момент, Крупан. Признаюсь, я не думал об этом.
atoi () также игнорирует начальные пробелы и завершающую хрень, поэтому она может быть успешной там, где другие более строгие парсеры потерпят неудачу. В зависимости от вашей точки зрения это может быть преимуществом или препятствием.
C++ FAQ Lite
[39.2] Как преобразовать std :: string в число?
https://isocpp.org/wiki/faq/misc-technical-issues#convert-string-to-num
лучший подход, imho, особенно с настраиваемым fail_on_leftover
Что такое "fail_on_leftover"?
Разрешите добавить свой голос за boost :: lexical_cast
#include <boost/lexical_cast.hpp>
int val = boost::lexical_cast<int>(strval) ;
Он выдает bad_lexical_cast при ошибке.
Как насчет некоторых примеров из следующего: codeproject.com/KB/recipes/Tokenizer.aspx Они очень эффективны и несколько элегантны.