18

是我还是 c 或 c++ 库中没有标准的修剪函数?有没有任何单一的功能可以作为修剪?如果没有,谁能告诉我为什么 trim 不是标准库的一部分?(我知道修剪正在增强)

我的修剪代码是

std::string trim(const std::string &str)
{
    size_t s = str.find_first_not_of(" \n\r\t");
    size_t e = str.find_last_not_of (" \n\r\t");

    if(( string::npos == s) || ( string::npos == e))
        return "";
    else
        return str.substr(s, e-s+1);
}

测试: cout << trim(" \n\r\r\n \r\n 文本在这里\nwith return \n\r\r\n \r\n "); -edit- 我主要想知道为什么它不在标准库中,BobbyShaftoe 的答案很棒。trim 不是标准 c/c++ 库的一部分吗?

4

7 回答 7

32

不,您必须自己编写或使用其他库,如 Boost 等。

在 C++ 中,你可以这样做:

#include <string>

const std::string whiteSpaces( " \f\n\r\t\v" );


void trimRight( std::string& str,
      const std::string& trimChars = whiteSpaces )
{
   std::string::size_type pos = str.find_last_not_of( trimChars );
   str.erase( pos + 1 );    
}


void trimLeft( std::string& str,
      const std::string& trimChars = whiteSpaces )
{
   std::string::size_type pos = str.find_first_not_of( trimChars );
   str.erase( 0, pos );
}


void trim( std::string& str, const std::string& trimChars = whiteSpaces )
{
   trimRight( str, trimChars );
   trimLeft( str, trimChars );
} 
于 2009-01-26T08:13:04.120 回答
16

trim() 不在标准库中的原因是,当制定最后一个标准时,他们必须在形式化当前行为(不添加任何新内容,只是稳定已经存在的内容)和添加新功能之间取得平衡。一般来说,他们宁愿不添加功能,除非 1) 否则不可能,或 2) 使用第三方库存在重大缺陷。做太多的改变会

  • 破坏与现有代码的兼容性(可能已经定义了自己的 trim()
  • 为编译器编写者添加更多工作(他们已经有大量工作要做)
  • 使语言更复杂的学习和使用。

使用 trim(),没有重大的互操作性问题。只要您的第三方 trim() 实现接受一个字符串并返回一个字符串,我们并不关心它的定义位置。所以在标准库中并不是真的需要。它可以很容易地由其他库提供。

相比之下,字符串类或向量之类的东西是标准库必须提供的类,因为如果您使用自定义字符串类,则只有该库中的字符串操作才能工作。使用标准库字符串,第三方库可以针对这个通用字符串定义,每个人都赢了。

当最后一个标准出来时,Herb Sutter在这里写了一篇文章很好地描述了这一点

当然,有一个 trim() 函数会很好,但是他们有更大的鱼要炸。他们必须首先标准化所有基础知识。我不认为 C++0x 会添加修剪功能,但它会添加许多其他便利实用程序,这些实用程序在 98 年被认为是“不必要的”或过于专业化。

于 2009-01-26T09:41:57.327 回答
3

正如其他人所说,委员会正忙于(许多)其他问题。 Boost填补了一些空白,例如 string_algo 库的修剪函数

string testTrim(" \n\r\r\n \r\n text here\nwith return \n\r\r\n \r\n ");
trim(testTrim);
cout << testTrim;
于 2009-01-26T13:03:54.343 回答
1

我对 C++ 了解不多,但请查看此内容以了解如何在 C 中完成此操作。(在我的辩护中:您确实在标题中说C /C++ :-)

于 2009-01-26T08:29:55.583 回答
1

在过去,使用scanf(),一个空格可以匹配任意数量的空白字符。

这就是我们使用fgets()后跟sscanf()的原因。防止将换行符匹配为该空格的一部分。

于 2009-01-26T09:15:23.213 回答
1

我认为主要原因是' '空白的定义相当狭窄。例如,我也想L' 'L' '一个trim()函数删除;然而,只有语言环境库有这样的洞察力。

相同的理由适用于常用的方法to_upperto_lower方法——有些人(尤其是在土耳其)不同意c &= ~0x20;通常用于 ASCII 的典型映射。

于 2011-03-25T16:20:45.310 回答
0

您可以使用 VC++。CString 类有一个修剪功能。:D

于 2009-05-07T09:29:16.310 回答