1

最初の括弧「(」と最後の括弧「(」の間のすべての文字を削除するのに問題があります。これを機能させるために使用するテストプログラムを次に示しますが、成功しません...

#include <iostream>
#include <string>

using namespace std;

int main()
{

    string str = "( 1221 ( 0 0 0 ) (1224.478541112155452 (1.32544e-7 0 0 ) ) )";

    int count = 0;

    for (std::string::size_type i = 0; i < str.size(); ++i)
    {

        if (str[i] == '(')
        {
            count += 1;
        }

        cout << "str[i]: " << str[i] << endl;

        if (count <= 4)
        {

            str.erase(0, 1);
            //str.replace(0, 1, "");

        }

        cout << "String: " << str << endl;

        if (count == 4)
        {
            break;
        }

        cout << "Counter: " << count << endl;

    }


    cout << "Final string: " << str << endl;

    system("PAUSE");

    return 0;
}

上記の例では、私の目標は (少なくとも) 文字列を取得することです。

"1.32544e-7 0 0 ) ) )"

元の文字列から抽出された

"( 1221 ( 0 0 0 ) (1224.478541112155452 (1.32544e-7 0 0 ) ) )"

より正確には、値を抽出したい

"1.32544e-7"

計算で使用するために double に変換します。

削除に成功しました

" 0 0 ) ) )"

それは一種の定数値だからです。

ありがとうございました!

4

2 に答える 2

6

問題を「最後の '(' の直後にある double を抽出したい」と言い換えると、C++ の翻訳は非常に簡単です。

int main()
{
    string str = "( 1221 ( 0 0 0 ) (1224.478541112155452 (1.32544e-7 0 0 ) ) )";

    // Locate the last '('.
    string::size_type pos = str.find_last_of("(");

    // Get everything that follows the last '(' into a stream.
    istringstream stream(str.substr(pos + 1));

    // Extract a double from the stream.
    double d = 0;
    stream >> d;                       

    // Done.        
    cout << "The number is " << d << endl;
}

(明確にするために、フォーマットの検証やその他の簿記は省略しています。)

于 2016-06-15T11:31:29.190 に答える
0

から文字列の長さまでループし、チャータラー0を消去していきます。つまり、各チャーターを確認する必要はありません。

少しの変更で、途中まで行くことができます。反復しようとしている文字列を変更しないでください。取得したインデックスを覚えておいてください。

using namespace std;
string str = "( 1221 ( 0 0 0 ) (1224.478541112155452 (1.32544e-7 0 0 ) ) )";

int count = 0;
std::string::size_type i = 0;
//^--------- visible outside the loop, but feels hacky
for (; i < str.size(); ++i)
{
    if (str[i] == '(')
    {
        count += 1;
    }

    cout << " str[i]: " << str[i] << endl;

    //if (count <= 4)
    //{
        //str.erase(0, 1);
    //}
    //^----------- gone

    cout << "String: " << str << endl;

    if (count == 4)
    {
        break;
    }

    cout << "Counter: " << count << endl;
}

return str.substr(i);//Or print this substring

これにより、4 番目の開き括弧が残るため、文字列の末尾に到達しない場合は、追加のインクリメントが必要になります。

于 2016-06-15T11:36:26.357 に答える