我试图从所有评论中找出我的字符串。 代码中的注释由";"表示。在句子前面。 有时程序的结束由&#34 ;;;"
表示想象一下我们有
push 34 ; example
push 45
add
为了检测出现&#34 ;;"我这样做:
std::size_t findComment = _string.find(";");
我希望能够做到这一点:
_string = _string.erase(findComment, '\n');
删除位置与第一个' \ n'之间的所有内容。
提前致谢:)
更新:
我拿了Konrad的版本。它运作良好。但是如果用户在标准输出上写下这个:
push int32(50)
push int32(50)
add
dump
;;
它应该执行该功能并显示100(转储显示堆栈)。但因为它结束于&#34 ;;;"函数trim_comments删除函数转储。所以它没有被执行..
答案 0 :(得分:1)
find
has an overload,可让您指定开始搜索位置:
typedef std::string::size_type size_type;
size_type const comment_start = _string.find(";;");
size_type const newline = _string.find("\n", comment_start + 2);
if (newline == std::string::npos)
_string.erase(comment_start);
else
_string.erase(comment_start, newline - comment_start);
此外,请注意在上面的代码中使用typedef
,您的代码对find
返回的位置使用了错误的类型。
但是,此代码仅删除单个注释。通过迭代erase
从字符串中删除多个注释是非常低效的。你要做的是从非评论片段构建一个全新的字符串。要在C ++中有效地构建字符串,请使用std::[o]stringstream
class而不是裸std::string
。
这是一个应该运行良好的示例实现:
std::string trim_comments(std::string const& code) {
typedef std::string::size_type size_t;
std::string const comment_start = ";;";
std::ostringstream result;
// Iteratively search for the start of the next comment and copy code before
// that into the result.
// We start by setting the previous comment end (the newline position) to
// the start of the code.
size_t newline_pos = 0;
while (newline_pos != std::string::npos) {
size_t const comment_pos = code.find(comment_start, newline_pos);
if (comment_pos == std::string::npos) {
// No more comments; copy the rest of the code from here until the
// end into the result and quit.
result << code.substr(newline_pos);
break;
}
result << code.substr(newline_pos, comment_pos - newline_pos);
// Find end of comment, assuming UNIX line endings.
newline_pos = code.find('\n', comment_pos + comment_start.length());
}
return result.str();
}
你会发现它比以前的短代码复杂得多。这是我们为正确性付出的代价。一个更简单的解决方案需要更高级的文本处理功能,例如正则表达式(C ++ 11本身支持,可以通过库添加到C ++ 98)。
答案 1 :(得分:0)
erase
方法完成了Job。所有你需要的是\n
位置的第二个迭代器。
// This code assumes that _string holds one line of the text.
std::size_t findComment = _string.find(";;");
std::size_t findNewLine = _string.find("\n");
_string = _string.erase(findComment, findNewLine);
如果必须处理多行,请使用Konrads回答。
如果您不想删除换行符,可以在删除前使用--findNewLine
。
答案 2 :(得分:0)
std::size_t commentPos = s.find(";;");
if (commentPos != std::string::npos) {
std::size_t nlPos = s.find_first_of("\r\n", commentPos);
if (nlPos != std::string::npos) {
s.erase(commentPos, nlPos - commentPos);
} else {
s.erase(commentPos);
}
}