删除第一个括号“(”和最后一个括号“(”包括这些括号C ++)之间的字符串中的所有字符

时间:2016-06-15 11:20:08

标签: c++ string replace erase erase-remove-idiom

我很难删除第一个括号“(”和最后一个括号“(”包括它们)之间的所有字符。这是我用来使其工作的测试程序,但没有成功......

#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 ) ) )"

因为它是一种常数值。

谢谢!

2 个答案:

答案 0 :(得分:6)

将问题改为&#34;我想在最后一次&#39;(&#39;&#34;之后)立即提取双,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;
}

(为了清楚起见,省略了格式验证和其他簿记。)

答案 1 :(得分: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

这使我们在第四个开头括号中,所以如果我们没有到达字符串的末尾,我们需要额外的增量。