std :: string, std :: vector 또는 std :: array에 저장된 문자의 숫자를 구문 분석 할 수 있습니다. 그러나 문자가 std :: unique_ptr에있는 버퍼에있을 때 나는 그렇게 할 수 없습니다.boost :: spirit :: qi :: parse를 사용하여 문자 배열에서 double을 파싱하는 방법
#include<memory>
#include<array>
#include<iostream>
#include "boost/spirit/include/qi.hpp"
int main()
{
const int max_size = 40;
std::array<wchar_t, max_size> numeric1;
std::wstring src = L"5178120.3663";
std::wcsncpy(numeric1.data(), src.data(), max_size);
double num = 0.0;
boost::spirit::qi::parse(numeric1.begin(), numeric1.end(), num);
std::cout.precision(15);
std::cout << num << std::endl; // OK
std::unique_ptr<wchar_t[]> numeric2(new wchar_t[max_size]);
std::wcsncpy(numeric2.get(), src.data(), max_size);
std::wcout << L"ok = " << std::wstring(numeric2.get()) << std::endl; // OK
boost::spirit::qi::parse(numeric2.data(), max_size, num); // fails to compile
std::cout.precision(15);
std::cout << num << std::endl;
// 'boost::spirit::qi::parse': no matching overloaded function found
return 0;
}
가 수정 :
boost::spirit::qi::parse(numeric2.get(), numeric2.get() + wcslen(numeric2.get()), num);
참조 당사의 내가 정신을 강화하기 위해 다음 문자열로 버퍼를 복사 할 수 있지만이 사본 여기
을 피하려는 나의 시도 anwer
이가이다 정답. 다음과 같이 수정하십시오. boost :: spirit :: qi :: parse (numeric2.get(), numeric2.get() + wcslen (numeric2.get()), num) 컴파일하지 않기 때문에 –
일치해야하는 wcsnlen을 사용하도록 수정되었습니다. 와이드 char 형이며 버퍼의 끝에서 벗어나지 않도록 보장합니다. 예제 코드에서 어쨌든 입력 문자열의 길이를 단지 하드 코딩하는 것이 가장 좋습니다. –