2016-10-24 4 views
1

현재 사용자가 일련 번호를 아래에 강조 표시된 숫자를 CString에 입력해야하는 특정 프로그램을 작성하기 위해 MFC를 사용하고 있습니다 (편의상 aCString이라고 함).CString을 float 배열로 변환

enter image description here

나는 문제없이 'strtok를' 를 사용하여 수레의 배열에 문자열 또는 문자의 배열을 변환 할 수 있습니다.

하지만 미리 언급 된 변환을 수행 할 수 있도록 CString을 문자열 또는 문자 배열로 변환하는 데 어려움을 겪고 있습니다!

- 난

strcpy(my_string, (LPCTSTR)aCString); 

strcpy을 시도하지만 오류

의 char * strcpy를 (숯불 * const가 숯불 *) 가지고 ' 에서 변환 할 수 없습니다 인수 2'LPCTSTR CONST '에' char * '

감사합니다.

+1

등가로'strtok를() '(파괴적인 것은 아니지만)이다 CString을가 :: 토큰 화() (HTTPS : // MSDN한다. microsoft.com/en-us/library/k4ftfkd2.aspx). –

+0

'CString'은 문자로 'char' 문자를 사용하지 않고 프로젝트 설정의'UNICODE' 매크로에 따라'char' 또는'wchar_t'로 정의되는'TCHAR'를 사용합니다. –

답변

4

CString 클래스 템플릿은 입력 문자열을 개별 토큰으로 분할하는 데 사용할 수있는 Tokenize 멤버를 제공합니다. 토큰은 다음 std::stof 함수를 사용하여 부동 소수점 값으로 변환 할 수

std::vector<float> ToFloats(const CString& numbers) { 
    std::vector<float> buffer; 
    int start{ 0 }; 
    CString token = numbers.Tokenize(_T(","), start); 
    while (start != -1) { 
     buffer.push_back(std::stof({ token.GetString(), 
             static_cast<size_t>(token.GetLength()) })); 
     token = numbers.Tokenize(_T(","), start); 
    } 
    return buffer; 
} 
+0

'std :: stof'에 대한 예외 처리를 잊지 마세요. –

+0

@BarmakShemirani :'std :: stof'를 골라내는 것이 이상합니다. 'std :: vector :: push_back'도 던질 수 있고'CStringT :: Tokenize'도 던질 수 있습니다. 그러나이 점 외에도이 기능에서 예외를 처리하는 적절한 방법은 전혀 수행하지 않는 것입니다. 이 함수는 입력을 변환하지 못했거나 출력을 구성 할 수 있는지 여부를 알 수 없습니다. 호출자 만 알고 있기 때문에 예외를 처리해야하는 호출자입니다. – IInspectable

+0

@BarmakShemirani :이 함수는 플로트 벡터를 반환합니다. 약속을 지키지 못하면 예외가 발생합니다. 호출 체인의 모든 호출자는 예외를 합리적으로 처리 할 수 ​​있는지 여부를 결정할 수 있습니다. 이 함수는 할 수 없습니다. 게다가 캐치되지 않은 예외는 * "충돌"하지 않습니다 *. 그들은'unexpected' 핸들러를 호출하는데, 디폴트로'terminate'를 호출합니다. 이는 깨끗하고 결정적인 종료입니다. – IInspectable