Преобразовать строку в int и получить количество символов, потребляемых в C ++ с помощью stringstream - PullRequest
4 голосов
/ 25 января 2011

Я новичок в C ++ (из C # фона) и пытаюсь узнать, как преобразовать строку в int.

Я получил его с помощью stringstream и вывел его в double, вот так:

const char* inputIndex = "5+2";
double number = 0;
stringstream ss(inputIndex);
ss >> number;
// number = 5

Это прекрасно работает. Проблема, с которой я сталкиваюсь, состоит в том, что анализируемые строки начинаются с числа, но могут иметь другие, не цифры, цифры после цифр (например, "5 + 2", "9- (3+) 2) "и т. Д.). stringstream анализирует цифры в начале и останавливается, когда встречается с нецифровой цифрой, как мне и нужно.

Проблема возникает, когда я хочу узнать, сколько символов было использовано для анализа числа. Например, если я разбираю 25+2, я хочу знать, что для разбора 25 были использованы два символа, чтобы я мог перемещать указатель строки.

До сих пор я работал, очистив stringstream, введя проанализированный номер обратно в него и прочитав длину полученной строки:

ss.str("");
ss << number;

inputIndex += ss.str().length();

Хотя это работает, мне это кажется очень хакерским (хотя это может быть просто из-за того, что я использую что-то вроде C #), и у меня есть ощущение, что это может вызвать утечку памяти, потому что str() создает копию строки.

Есть ли другой способ сделать это, или я должен придерживаться того, что у меня есть?

Спасибо.

Ответы [ 2 ]

6 голосов
/ 25 января 2011

Вы можете использовать std::stringstream::tellg(), чтобы узнать текущую позицию получения во входном потоке.Сохраните это значение в переменной, прежде чем извлекать из потока.Затем получите позицию снова после того, как вы извлечете из потока.Разница между этими двумя значениями заключается в количестве извлеченных символов.

double x = 3435;
std::stringstream ss;
ss << x;

double y;
std::streampos pos = ss.tellg();
ss >> y;
std::cout << (ss.tellg() - pos) << " characters extracted" << std::endl;
1 голос
/ 16 апреля 2013

Решение, описанное выше с использованием tellg (), не будет работать на современных компиляторах (таких как gcc-4.6).

Причина этого в том, что tellg () действительно показывает положение курсора, который теперь находится вне области видимости.Смотрите, например, " Поток файла Tellg / Tellp и GCC-4.6 это ошибка? "

Поэтому вам также необходимо проверить на eof () (то есть весь вход был использован).

...