如何使用c ++从字符串的开头和后面删除撇号

Posted

技术标签:

【中文标题】如何使用c ++从字符串的开头和后面删除撇号【英文标题】:How to remove the Apostrophe at the from and the back from a string with c++ 【发布时间】:2019-10-31 07:06:45 【问题描述】:

我在从字符串中删除第一个和最后一个撇号时遇到了一些麻烦。我有一个字符串向量,其中一些在字符串的开头或后面有撇号。 例如,我有 'cause, 'til, holdin', don't 我想要这样的输出原因,直到,保持,不要 我该怎么做?

【问题讨论】:

显示一些你尝试过的代码 你是怎么得到'cause, 'til, holdin', don't中的字符串的?看起来您正在尝试纠正先前的解析错误。匹配“复数名词的所有格是在名词以s结尾时仅添加撇号”的单词呢?示例:lawyers’ 【参考方案1】:

我想出了以下实现,它涵盖了空输入场景而不调用任何未定义的行为。

#include <vector>
#include <string>
#include <iostream>
#include <algorithm>

std::vector<std::string> contents = "'cause", "'til", "holdin'", "don't", "";

void impl1() 
    for(auto & content:contents)
        if(!content.empty() && (*content.begin()) == '\'')
            content.erase(content.begin());
        

        if(!content.empty() && content.back() == '\'')
            content.pop_back();
        

        std::cout << content << " " << std::endl;
    


void impl2()
    auto erase_if = [](auto& container, auto&& itr, auto val)
        if(!(itr == std::end(container)) && ((*itr) == val))
            container.erase(itr);
          
    ;   
    for(auto & content: contents)
        erase_if(content, content.begin(), '\'');
        erase_if(content, std::string::iterator&content.back(), '\'');

        // print trimmed output
        std::cout << content << " " << std::endl;
    



int main(void)
    //impl1();
    impl2();
    return 0;

【讨论】:

【参考方案2】:

您可以使用.erase() 成员函数从字符串中删除字符。示例:

#include <iostream>
#include <string>
#include <vector>

void trim_inplace(std::string &s, char c) 
  if (s.size() >= 2) 
    auto it = s.begin();
    if (*it == c) 
      s.erase(it);
    
    it = s.end() - 1;
    if (*it == c) 
      s.erase(it);
    
  


int main() 
  std::vector<std::string> foo"'cause", "'til", "holdin'", "don't";
  for (auto &s : foo) 
    std::cout << s << " -> ";
    trim_inplace(s, '\'');
    std::cout << s << '\n';
  
  return 0;

【讨论】:

可以在if(s.size() &gt;= 2) 中添加一个else-branch 以覆盖trim_inplace("'"'\'' 之类的内容)`(修剪一个仅由单个撇号组成的字符串,这将导致一个空字符串)。

以上是关于如何使用c ++从字符串的开头和后面删除撇号的主要内容,如果未能解决你的问题,请参考以下文章

急!如何批量删除数据库中以特定字符开头和结尾的字符串

Xamarin/SQLite/C# - 如何使用菜单项删除从列表视图和 SQLite 表中删除一行

如何从 R 中的数据帧的开头和结尾删除 NA?

如何从字符串的开头和结尾删除换行符?

如何使用linux系统vim中的复制,粘贴和删除

如果消息以前缀 + 使用 discord.js 的命令开头,如何使 if 语句起作用