Стандартный класс строк уже имеет функцию-член, которая дает вам доступ к внутреннему массиву символов, c_str (), так что вы можете просто передать его одной из стандартных функций библиотеки C, которые разбирают целые числа, например strtol ():
string s = "1234";
long n = strtol(s.c_str(), 0, 10);
Это самый простой код, если вы уже знаете, что строка является допустимым целым числом и не заботитесь о проверке ошибок.Если вам нужна полная проверка ошибок, вы должны сделать что-то вроде этого:
char* end = 0;
errno = 0;
long n = strtol(s.c_str(), &end, 10);
if (end == 0 || *end == 0)
throw invalid_argument("Not a number");
else if (errno == ERANGE)
throw overflow_error("Number is out of range");
else if (errno != 0)
throw invalid_argument("Not a number");
В качестве альтернативы вы можете использовать потоки C ++, если хотите полностью избежать массивов символов в стиле C (или, скорее, полностью скрыть их внутри классов):
istringstream in(s);
int n;
in >> n;
Вы также можете использовать boost :: lexical_cast, который делает то же самое.