c ++ Преобразование std :: string в int, double и т. д. БЕЗ использования массива char - PullRequest
0 голосов
/ 21 января 2012

В C ++ я видел это только путем преобразования строкового объекта в массив символов.Учебники с массивом довольно сложны для понимания.Но я хочу сделать преобразование без массива.

У меня есть идея, как это сделать: строка «1234».После этого я преобразую этот текст в целое число следующим образом:

if (symol4 == "4") int_var += 4 * 1;
if (symol3 == "3") int_var += 3 * 10;
if (symol3 == "2") int_var += 2 * 100;
if (symol3 == "1") int_var += 1 * 1000; //Don't worry, I'm familiar with cycles, this code is only for explaining my algorithm

Я надеюсь, что вы можете понять идею.

Но я не знаю, является ли это лучшим способом.Я не знаю, есть ли библиотека, в которой есть функция, которая позволяет мне это делать (я не удивлюсь, если она есть).

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

Как лучше всего преобразовать строку в целое, двойное и т. Д. БЕЗ использования массива символов.

Ответы [ 6 ]

8 голосов
/ 21 января 2012

boost::lexical_cast на помощь: int result = boost::lexical_cast<int>(input)

Если вы не хотите полагаться на boost, вы можете использовать поток строк, например:

std::stringstream ss;
int result;
ss << input;
ss >> result;

но это довольно окольным имо

И нет, не используйте atoi - эта функция была ошибочной даже в C, и со временем она не улучшилась. Он возвращает 0, когда при синтаксическом анализе произошла ошибка - что вызывает очевидную проблему, заключающуюся в том, как отличить ошибку от анализа строки "0".

5 голосов
/ 21 января 2012

Я действительно не могу понять, о чем ваш вставленный код, но в C ++ лучший способ преобразовать строку в целое число или число с плавающей запятой - это использовать stringstream.

const char* str = "10 20.5";
std::stringstream ss(str);
int x;
float y;

ss >> x >> y;
2 голосов
/ 21 января 2012

Существует функция atoi , которую вы можете использовать. Это преобразует его в массив символов, но вам не нужно выполнять математические операции, связанные с индексацией массива в цикле for.

#include <stdlib.h>
...
String number = "1234";    
int value = atoi(number.c_str());
std::cout << number;
...

Надеюсь, что для атойей, скажем, он это поймет>.>

#include <boost/lexical_cast.hpp>

try {
    int x = boost::lexical_cast<int>( "123" );
} catch( boost::bad_lexical_cast const& ) {
    std::cout << "Error: input string was not valid" << std::endl;
}

Лучший способ - самый эффективный, я не думаю, что вы найдете лучшую альтернативу этому или использование массива символов.

1 голос
/ 21 января 2012
  • Я рекомендую Boost.Lexical_Cast

  • Или посмотрите предстоящий Boost.Conversion

  • Может быть достигнуто с помощьюBoost.Spirit, но несколько более сложный

См. «Строковые расширители усадебной фермы» статья Херба Саттера.

1 голос
/ 21 января 2012

Стандартный класс строк уже имеет функцию-член, которая дает вам доступ к внутреннему массиву символов, 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, который делает то же самое.

0 голосов
/ 21 января 2012

Возможно, вы захотите взглянуть на функцию atoi .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...