Перевод из std::wstring в число

195
01 декабря 2017, 06:00

Если у меня есть указатель на строку в середине которой содержится число. Я могу перевести в число примерно так:

wchar_t* begin = L"A12A";
begin++;
wchar_t* end;
unsigned long n = ::wcstoul(begin, &end, 10);

А как мне сделать подобное если число содержится в std::wstring и есть итератор на начало числа:

std::wstring wstr(L"A12B")
std::wstring::iterator it = wstr.begin();
it++;
//Получаем число

И на выходе итератор должен указывать на B;

Answer 1

Если у тебя есть только итератор под рукой и нет родительского (к итератору) объекта (строка), тогда можно вот так сделать

wchar_t* itAddress = &(*it);
unsigned long n = ::wcstoul(itAddress, L'\0', 10);

Т.е. через итератор получаем указатель на данные, которые хранятся в строке (итератор для строки по себе сам указатель по сути, его просто надо правильно преобразовать)

Если у тебя есть родительская строка, то можно сделать так:

unsigned long n = ::wcstoul(wstr.c_str() + 1, L'\0', 10);

Т.е. сразу легально (средствами строки) получаем указатель на данные, которые хранятся в строке

P.S.

Чуть скорректировал код чтобы определять где функция wcstoul закончила работу

wchar_t* itAddress = &(*it);
wchar_t* itAddressEnd = 0;
unsigned long n = ::wcstoul(itAddress + 1, &itAddressEnd, 10);
std::wstring::iterator itNew = it + ((long long)itAddressEnd - (long long)itAddress - 2);

-2 потому что 1) начали с символа it+1 - это дало -1, 2) закончили на предыдущем символе - это дало еще -1

Answer 2

В голову приходит только решение вроде такого

#include <iostream>
#include <string>
using namespace std;
int main()
{
  wstring wstr(L"A1298BAAC");
  wstring::iterator it = wstr.begin();
  it++;
  wchar_t* result_it;
  auto x = wcstoul(&*it, &result_it, 10);
  wstring::iterator it2 =  wstr.begin();
  while(it2 != wstr.end() && &*it2++ != result_it){
  }
  int pos = std::distance(wstr.begin(), it2) - 1;
  std::wcout << x << endl << result_it << endl << pos << endl <<  wstr.substr(pos);
}

И вывод

1298
BAAC
5
BAAC 
READ ALSO
Как соединить имя пути и файла?

Как соединить имя пути и файла?

Нужно сохранить файл скриншота в папке пользователя в Temp

200
Visual Studio Не удается активировать приложение для Магазина Windows

Visual Studio Не удается активировать приложение для Магазина Windows

У меня проблема с UWP и Visual Studio 2015 ProЯ создаю UWP приложение на Visual C++, и в нем просто отправляю http запрос на сервер

301
vector&lt;shared_ptr&gt; ptrs, ptrs.pop_back() returns void

vector<shared_ptr> ptrs, ptrs.pop_back() returns void

Есть следующий класс:

172
вопросы по json парсингу

вопросы по json парсингу

Есть ответ, в котором перечень валют с значениямиНа случай если список валют увеличится, я в заранее хотел распарсить и сохранить массив...

288