c++ - 在方法中引用我正在阅读的流
问题描述
我在一个名为 的方法中total_parsing
,并创建了一个局部变量
istringstream stream(to_analize)
(to_analize
我必须分析的字符串在哪里)。
当我到达特殊字符 (
或者 [
我想声明一个方法时reading_between_bracket
,该方法将字符串从左括号读取到右括号。在那之后,我希望该方法reading_between_bracket
让我有可能继续阅读全部解析。我需要一种读取括号中字符串的方法,因为我想在每次到达括号时递归地声明它。该字符串采用示例的格式。
例子 -( B + D -( ( G*F) -H )))
void total_parsing(string to_analize) {
istrinstream stream(to_analize);
do {
// DO OTHER OPERATION WITHOUT BRACKET
if (token == "(" || !token.find('(')) {
stream = reading_between_bracket(stream);
}
} while (stream >> token);
}
istringstream reading_between_bracket(istringstream stream) {
// DO THE OPERATION BETWEEN BRACKET
// RECURSIVE CALL OF THIS METHOD IF I REACH A BRACKET,RETURN THE STREAM
return stream(or a pointer that make possible to continue reading);
}
PS 我必须使用 C++11,我可以使用 STL 和 sstream。
描述中的代码不起作用
解决方案
该代码不起作用,因为按值传递需要进行复制,并且可能无法复制字符串流对象。另请参阅。
因此,改为通过引用传递流:
void parse(string input){
istringstream stream(input);
string token;
while (stream >> token) {
if (is_open_bracket(token)) {
parse_inside_brackets(stream);
}
}
}
void parse_inside_brackets(istringstream& stream) {
// notice the '&'
// do some processing here; the stream's internal position is updated
// there is no need to return anything; the change to `stream` will be
// reflected in the caller
}
要完成您描述的递归,您可能需要更多类似的东西:
void parse(string input) { // helper function to set up recursion
parse_rec(istringstream(input), 0);
}
void parse_rec(istringstream& stream, int level) {
// 'level' param indicates how many nested brackets we've seen
string token;
while (stream >> token) {
if (is_close_bracket(token) { return; }
else if (is_open_bracket(token)) {
parse_rec(stream, level + 1);
}
else {
// handle token at this level
}
}
// If we get here, we ran out of tokens. So if we're not at the base level...
if (level) {
// ... then we had an unmatched bracket, so do error handling
}
}
(但您可能应该阅读更复杂的解析技术:)另一方面,如果您可以使用这种方法处理任务,那么也许您甚至不需要递归,只需跟踪缩进级别。)
推荐阅读
- jquery - 使用 fancybox 的各种图像尺寸
- javascript - 有没有办法在传单中动态绘制圆形标记?
- java - 使用“SSH2 PUBLIC KEY”格式的公钥验证 JSch 中的主机密钥(RFC 4716)
- reactjs - 如何创建代理来访问外部 API?
- javascript - 如何使用 casperjs 脚本运行外部程序(exe、bat)
- php - 电子邮件正文未在 html 中显示
- python - python - 如何在找不到模块的情况下解决python中的ddl和libraray路径问题
- ios - SIGBRT 错误:无法将“UITableViewController”(0x113ccb7e0)类型的值转换为“Racing_Weather.PredictorTableViewController”(0x1086645b0)
- swift - AVPlayer 直到单元被回收才启动
- c# - Timers.Timer 超过 Interval 后继续工作