trim不是标准c / c ++库的一部分?

时间:2009-01-26 08:03:31

标签: c++ trim standard-library

是c还是c或c ++库中没有标准修剪函数?是否有任何单一功能充当修剪?如果没有,谁能告诉我为什么修剪不是标准库的一部分? (我知道修剪是在提升)

我的修剪代码是

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<<修剪(“\ n \ r \ r \ n \ r \ n \ n \ n文本在这里\ n,返回\ n \ r \ n \ r \ n \ r \ n”); -编辑- 我大多想知道为什么它不在标准库中,BobbyShaftoe答案很棒。 trim is not part of the standard c/c++ library?

7 个答案:

答案 0 :(得分:29)

不,您必须自己编写或使用其他库,如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 );
} 

答案 1 :(得分:16)

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

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

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

相比之下,像字符串类或向量这样的类是标准库必须提供的类,因为如果使用自定义字符串类,则只有来自该库的字符串操作才有效。使用标准库字符串,第三方库可以定位此常见字符串定义,并且每个人都获胜。

当最后一个标准出来时,Herb Sutter撰写了一篇非常好的文章here

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

答案 2 :(得分:3)

正如其他人所说,委员会正忙于(很多)其他问题。 Boost填补了一些空白,例如string_algo图书馆的trimming functions

string testTrim(" \n\r\r\n \r\n text here\nwith return \n\r\r\n \r\n ");
trim(testTrim);
cout << testTrim;

答案 3 :(得分:1)

我不太了解C ++,但check this out看看如何在C中完成此任务。(在我的辩护中:你在标题中说过 C / C ++: - )

答案 4 :(得分:1)

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

这就是为什么我们使用 fgets() ,然后使用 sscanf() 。防止将换行符作为该空格的一部分。

答案 5 :(得分:1)

我认为主要原因是' '是一个相当狭窄的空白定义;例如,我还希望通过L' '函数删除L' 'trim();但是,只有 locale 库具有这样的洞察力。

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

答案 6 :(得分:-1)

您可以使用VC ++。 CString类有一个trim函数。 :d