【问题标题】:Remove First and Last Character C++删除第一个和最后一个字符 C++
【发布时间】:2014-07-13 03:09:50
【问题描述】:

如何从std::string中删除第一个和最后一个字符,我已经在做下面的代码了。

但是这段代码只删除了最后一个字符

m_VirtualHostName = m_VirtualHostName.erase(m_VirtualHostName.size() - 1)

如何同时删除第一个字符?

【问题讨论】:

  • 如果字符串为空,那段代码会运行起来。
  • m_VirtualHostName 是什么类型?
  • @PaulMcKenzie 所以我必须先验证,如果 VirtualHostName 不为空。

标签: c++ string stdstring erase-remove-idiom


【解决方案1】:
std::string trimmed(std::string str ) {
if(str.length() == 0 ) { return "" ; }
else if ( str == std::string(" ") ) { return "" ; } 
else {
    while(str.at(0) == ' ') { str.erase(0, 1);}
    while(str.at(str.length()-1) == ' ') { str.pop_back() ; }
    return str ;
    } 
}

【讨论】:

  • 这个函数对字符串进行修剪,它相当于 QString::trimmed(QString) ,它删除了 end 和 front 的空白,做任何需要修改它以使其完成工作......
  • while 循环(尤其是前面的循环)会使这非常低效。搜索最后一个/第一个空白并为每个空白执行一次擦除。
  • 您可以将两个条件放在相同的 while 中:作为两个条件使用 AND 或一个 while 使用 if 条件和 break。
【解决方案2】:

我的 BASIC 解释器将开头和结尾的引号用

str->pop_back();
str->erase(str->begin());

当然,我总是期望格式良好的 BASIC 样式字符串,所以如果不是,我会以失败的 assert 中止:

assert(str->front() == '"' && str->back() == '"');

只要我的两分钱。

【讨论】:

    【解决方案3】:

    嗯,你也可以erase() 第一个字符(注意erase() 修改了字符串):

    m_VirtualHostName.erase(0, 1);
    m_VirtualHostName.erase(m_VirtualHostName.size() - 1);
    

    但在这种情况下,更简单的方法是取一个子字符串:

    m_VirtualHostName = m_VirtualHostName.substr(1, m_VirtualHostName.size() - 2);
    

    首先要小心验证字符串实际上至少有两个字符...

    【讨论】:

    • 如果我只有 2 个字符,它会崩溃?
    • @Putra:是的。 C++ 那样不是特别友好 ;-) 编辑:不,我误读了你的评论。如果您有少于两个字符(0或1),它将崩溃。
    • @PutraFajarHasanuddin 当你在字符串中没有或 1 个字符时它会出现。它记录在here。仅当size() 返回至少 1 时才执行第二行。
    • 虽然substr 在代码中看起来更干净,但它会触发额外的内存分配(这可能很重要,也可能不重要)。如果声明为:str.erase(str.end()-1); str.erase(str.begin());,第一次擦除也可能更简单
    猜你喜欢
    • 2011-04-11
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2013-12-12
    • 2010-12-16
    • 2012-05-13
    • 1970-01-01
    相关资源
    最近更新 更多