1

「$:」「213.23453」のようなさまざまな文字を含む文字列があります。double 値 213.23453 を抽出して変数に格納するにはどうすればよいですか。これは C++/C であり、ラムダを使用できません。

4

3 に答える 3

2

次のように、関数の「貧乏人の正規表現」を使用sscanfして、最初の桁の前の文字をスキップし、次に double を読み取ることができます。

char *str = "\"$: \" \"213.23453\"";
double d;
sscanf(str, "%*[^0-9]%lf", &d);

最初のパーセンテージ形式の後のアスタリスクに注意してください。これはsscanf、内容を出力バッファーに書き込まずに文字列を読み取るように指示します。

これはideoneのデモです。

于 2013-03-19T11:55:27.380 に答える
0

純粋な C++ の解決策は、数字の前のゴミ文字 ( で識別される最初の数字std::isdigit) を手動で切り取り、一時istringstreamオブジェクトを作成してから取得することdoubleです。

std::string myStr("$:. :$$#&*$ :213.23453$:#$;");

// find the first digit:
int startPos = 0;
for (; startPos < myStr.size(); ++startPos)
    if (std::isdigit(myStr[startPos])) break;

// cut off the trash:
myStr = myStr.substr(startPos, myStr.size() - startPos);

// retrieve the value:
double d;
std::istringstream(myStr) >> d;

ただし、適切な形式が指定された C スタイルsscanfでここでも十分です :)

于 2013-03-19T12:00:05.137 に答える
0

正規表現を使用します。

[$]?[0-9]*(\.)?[0-9]?[0-9]?

これは、$ 記号のあるものとないものに一致する必要があります。

Boost.Regexは非常に優れた正規表現ライブラリです

個人的には、Boost.Xpressiveの方が使いやすいと思います。これはヘッダーのみのライブラリであり、静的正規表現 (コンパイル時にコンパイルされる正規表現) などの優れた機能がいくつかあります。

C++11 準拠のコンパイラを使用している場合は、他の何かを使用する正当な理由がない限り、 std::regexを使用してください。

于 2013-03-19T11:46:32.440 に答える