2016-10-24 25 views
1

私は現在、特定のプログラムを作成するためにMFCを使用しています。ユーザは、数字の列をCStringの下にハイライト表示する必要があります(簡略化のためaCStringとしましょう)。CStringを浮動小数点数の配列に変換する

enter image description here

私は問題なく「strtokは」 を使用してfloatの配列に文字列や文字の配列を変換することができます。

しかし私はCStringを文字列または文字列に変換するのに苦労しているので、私は前述の変換を行うことができます!

-Iはstrcpy

strcpy(my_string, (LPCTSTR)aCString); 

を試みたが、そのエラー

するchar * strcpyの(char型*、constのchar型*)を得た ': から引数2を変換することはできません 'のconst' から' LPCTSTR char * '

私は助けてくれてありがとう!

+1

等価(ただし破壊的ではない)のCString ::トークン化()](HTTPSである:// MSDN。 microsoft.com/en-us/library/k4ftfkd2.aspx)。 –

+0

国際化のため、 'CString'は文字として通常の' char'を使用しませんが、プロジェクト設定の 'UNICODE'マクロに応じて' char'または 'wchar_t'として定義される' TCHAR'を使用します。 –

答えて

4

クラステンプレートは、入力文字列を個々のトークンに分割するために使用できるTokenizeメンバーを提供します。トークンは次にstd::stof関数を使用して浮動小数点値に変換することができる: `)(`はstrtokに

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:この関数は浮動小数点のベクトルを返すことを約束します。その約束を満たすことができない場合は、例外がスローされます。コールチェーン上の呼び出し元は、例外を合理的に処理できるかどうかを判断できます。この関数はできません。さらに、キャッチされない例外は*「クラッシュ」しません*。彼らはデフォルトで 'terminate'を呼び出す' unexpected'ハンドラを呼び出します。これはクリーンで決定論的なシャットダウンです。 – IInspectable

関連する問題