Сотрите все символы в строке между первой круглой скобкой «(» и последней круглой скобкой «(«, включая эти скобки, переполнение стека)

У меня проблемы с удалением всех символов между первой круглой скобкой «(» и последней круглой скобкой «(«), включая их. Вот тестовая программа, которую я использую, чтобы она работала, но безуспешно …

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

и преобразовать в удвоение, чтобы использовать в расчетах.

Мне удалось успешно удалить

" 0 0 ) ) )"

так как это своего рода постоянное значение.

Спасибо!

1

Решение

Перефразируя проблему следующим образом: «Я хочу извлечь двойное число, следующее сразу за последним» («», перевод на 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;
}

(Проверка формата и другая бухгалтерия оставлены для ясности.)

6

Другие решения

Вы зацикливаетесь на 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

Это оставляет нас в четвертых открывающих скобках, поэтому нам нужно дополнительное увеличение, если мы не дойдем до конца строки.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector