当前位置:  开发笔记 > 编程语言 > 正文

std :: string擦除最后一个字符失败?

如何解决《std::string擦除最后一个字符失败?》经验,为你挑选了1个好方法。

我正在尝试将通配符形式的用户输入更改("*word*")为正则表达式格式.为此,我使用下面的代码去除'*'输入的开头和结尾,以便我可以在任一端添加正则表达式字符:

string::iterator    iter_begin = expressionBuilder.begin();
string::iterator    iter_end = expressionBuilder.end();
iter_end--;
if ((char)*iter_begin == '*' && (char)*iter_end == '*')
{
    expressionBuilder.erase(iter_begin);
    expressionBuilder.erase(iter_end);
    expressionBuilder = "\\b\\w*" + expressionBuilder + "\\w*\\b";
}

然而,调用"expressionBuilder.erase(iter_end)"不会删除尾随'*'从输入字符串,所以我风与不正确的正则表达式.我在这做错了什么? "(char)*iter_end == '*'"对于要运行的if语句中的代码必须为true(它确实如此),那么为什么传递给erase()时相同的迭代器不起作用?



1> Michael Burr..:

到目前为止,您的原始代码和建议的解决方案除了您发布的明显问题外还有一些问题:

修改字符串后使用无效的迭代器

甚至在修改字符串之前解除引用可能无效的迭代器(例如,如果字符串为空)

如果expressionBuilder字符串只包含一个'*'字符,则会出现错误

现在,如果使用代码段/例程的代码已经验证字符串至少有2个字符,那么最后两个项目可能不是真正的问题,但是如果不是这种情况,我认为以下内容更加强大面对expressionBuilder的任意值:

// using the reverse iterator rbegin() is a nice easy way 
//     to get the last character of a string

if ( (expressionBuilder.size() >= 2) &&
    (*expressionBuilder.begin()  == '*') &&
    (*expressionBuilder.rbegin() == '*') ) {

    expressionBuilder.erase(expressionBuilder.begin());

    // can't nicely use rbegin() here because erase() wont take a reverse
    //  iterator, and converting reverse iterators to regular iterators
    //  results in rather ugly, non-intuitive code
    expressionBuilder.erase(expressionBuilder.end() - 1); // note - not invalid since we're getting it anew

    expressionBuilder = "\\b\\w*" + expressionBuilder + "\\w*\\b";
}

需要注意的是,当这个代码将工作expressionBuilder"","*"或者"**"在不执行任何未定义行为.但是,在这些情况下,它可能无法产生您想要的结果(因为我不确切知道在这些情况下您想要的是什么).修改以满足您的需求.

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有