删除字符直到下一个' \ n'

时间:2015-02-21 13:04:54

标签: c++ c++98

我试图从所有评论中找出我的字符串。 代码中的注释由";"表示。在句子前面。 有时程序的结束由&#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删除函数转储。所以它没有被执行..

3 个答案:

答案 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);
    }
}