gpt4 book ai didi

c++ - 如何按多种括号类型拆分字符串但仍将括号保留在 C++ 中?

转载 作者:行者123 更新时间:2023-11-28 04:32:25 25 4
gpt4 key购买 nike

有没有办法将字符串拆分成小部分并存储到 vector 中。

例如:

一个字符串:str = "(a b c) d e f [[g h i]]"。预期的输出是:

(a b c)
d e f
[[g h i]]

示例代码:

vector<string> token;
string str = "(a b c)d e f[[g h i]]";
string bracketS = "()[]";
istringstream ss(str);
string section;
string tok;

while (getline(ss,section)) {
size_t start = 0;
size_t end = section.find_first_of(bracketS);
while (end != string::npos) {
tok = section.substr(start, end - start);
token.push_back(tok);
start = end + 1;
end = section.find_first_of(bracketS, start);
}
}

输出没有括号:

      a b c
d e f
g h i

试图调整我的 section.substr(start-1, end - start+2)那么我的输出是:

(a b c)
) d e f [
[g h i]

为什么中间 vector 是错误的。

也试过做 strtok。但输出与第一个相同。

还有其他方法吗?

最佳答案

如果左括号缺少右括号或右括号与左括号不匹配,这是一个可能的解决方案,用于解析和抛出 parsing_error 的堆栈。

#include <iostream>
#include <stack>
#include <string>
#include <vector>

const auto Brackets = { std::make_pair('(', ')'), std::make_pair('[', ']') };

const auto is_opening_bracket = [](const char c) {
return std::find_if(Brackets.begin(), Brackets.end(),
[c](const auto& p) { return p.first == c; } ) != Brackets.end();
};
const auto is_closing_bracket = [](const char c) {
return std::find_if(Brackets.begin(), Brackets.end(),
[c](const auto& p) { return p.second == c; } ) != Brackets.end();
};

const auto get_opening_bracket = [](const char c) {
const auto p = std::find_if(Brackets.begin(), Brackets.end(), [c](const auto& p) { return p.second == c; });
if (p == Brackets.end())
return '0';

return p->first;
};

struct parsing_error {};

int main() {
const std::string str = "(a b c)d e f[[g h i]]";

std::stack<char> brackets;
std::vector<std::string> tokens;
std::string token;

for (const auto c : str) {
if (is_opening_bracket(c)) {
if (!token.empty() && brackets.empty()) {
tokens.push_back(token);
token.clear();
}

brackets.push(c);
token += c;
} else if (is_closing_bracket(c)) {
if (brackets.top() != get_opening_bracket(c))
throw parsing_error();

brackets.pop();
token += c;

if (brackets.empty()) {
tokens.push_back(token);
token.clear();
}
} else {
token += c;
}

}

if (!brackets.empty())
throw parsing_error();

for (const auto& token : tokens)
std::cout << token << '\n';

return 0;
}

关于c++ - 如何按多种括号类型拆分字符串但仍将括号保留在 C++ 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52524496/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com