修剪字符串中的空格

fol*_*mer 21 c++ string whitespace trim

我知道有几种方法可以在Java和C中做到这一点很好,但在C++中,我似乎无法找到一种方法来轻松实现字符串修剪功能.

这就是我目前拥有的:

string trim(string& str)
{
    size_t first = str.find_first_not_of(' ');
    size_t last = str.find_last_not_of(' ');
    return str.substr(first, (last-first+1));
}
Run Code Online (Sandbox Code Playgroud)

但每当我试着打电话

trim(myString);
Run Code Online (Sandbox Code Playgroud)

我得到编译器错误

/tmp/ccZZKSEq.o: In function `song::Read(std::basic_ifstream<char, 
std::char_traits<char> >&, std::basic_ifstream<char, std::char_traits<char> >&, char const*, char const*)':
song.cpp:(.text+0x31c): undefined reference to `song::trim(std::string&)'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

我试图找到一种简单而标准的方法,从字符串中修剪前导和尾随空格,而不占用100行代码,我尝试使用正则表达式,但无法使其工作.

我也不能使用Boost.

Ant*_*ong 39

你的代码很好.您所看到的是链接器问题.

如果您将代码放在一个文件中,如下所示:

#include <iostream>
#include <string>

using namespace std;

string trim(const string& str)
{
    size_t first = str.find_first_not_of(' ');
    if (string::npos == first)
    {
        return str;
    }
    size_t last = str.find_last_not_of(' ');
    return str.substr(first, (last - first + 1));
}

int main() {
    string s = "abc ";
    cout << trim(s);

}
Run Code Online (Sandbox Code Playgroud)

然后执行g++ test.cc并运行a.out,您将看到它的工作原理.

您应该检查包含该trim函数的文件是否包含在编译过程的链接阶段.

  • 这会导致空字符串崩溃! (4认同)
  • 它正确地处理"""或"""` (3认同)
  • 添加'if(first = first string :: npos)return"";' 避免崩溃.除此之外,这是一个很好的简单解决方案 我看到人们如何使用boost(!!!)来实现这些东西. (3认同)

jha*_*a-G 23

以下是如何做到这一点:

std::string & trim(std::string & str)
{
   return ltrim(rtrim(str));
}
Run Code Online (Sandbox Code Playgroud)

支持功能的实现如下:

std::string & ltrim(std::string & str)
{
  auto it2 =  std::find_if( str.begin() , str.end() , [](char ch){ return !std::isspace<char>(ch , std::locale::classic() ) ; } );
  str.erase( str.begin() , it2);
  return str;   
}

std::string & rtrim(std::string & str)
{
  auto it1 =  std::find_if( str.rbegin() , str.rend() , [](char ch){ return !std::isspace<char>(ch , std::locale::classic() ) ; } );
  str.erase( it1.base() , str.end() );
  return str;   
}
Run Code Online (Sandbox Code Playgroud)

一旦你完成所有这些,你也可以这样写:

std::string trim_copy(std::string const & str)
{
   auto s = str;
   return ltrim(rtrim(s));
}
Run Code Online (Sandbox Code Playgroud)

试试这个

  • +1 用于介绍我从周围的许多其他答案中想念的语言环境。不一定是正确的,因为它取决于应用案例,但在处理字符串时仍然是一个重要因素。 (4认同)

小智 6

我认为如果str只包含空格,substr()会抛出异常.

我会将其修改为以下代码:

string trim(string& str)
{
    size_t first = str.find_first_not_of(' ');
    if (first == std::string::npos)
        return "";
    size_t last = str.find_last_not_of(' ');
    return str.substr(first, (last-first+1));
}
Run Code Online (Sandbox Code Playgroud)