【问题标题】:trim is not part of the standard c/c++ library?trim 不是标准 c/c++ 库的一部分吗?
【发布时间】:2009-01-26 08:03:31
【问题描述】:

是我还是 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);
}

test: cout trim is not part of the standard c/c++ library?

【问题讨论】:

    标签: c++ trim standard-library


    【解决方案1】:

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

    【讨论】:

    • 这是我见过的所有最短实现中最好的,您甚至不需要做任何花哨的技巧就可以做到这一点。干得好!
    【解决方案2】:

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

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

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

    相比之下,像字符串类或向量这样的类是标准库必须提供的类,因为如果您使用自定义字符串类,则只有来自该库的字符串操作才有效。有了标准库字符串,第三方库就可以针对这个通用的字符串定义,大家都赢了。

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

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

    【讨论】:

      【解决方案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;
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 有一些函数用于操作 streams,而不是 strings。存在等效项,例如 stream &gt;&gt; std::ws,它会占用所有后续空格。
        【解决方案5】:

        我对 C++ 了解不多,但 check this out 看看如何在 C 中实现这一点。(在我的辩护中:你确实在标题中说 C/C++ :-)

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-01-20
              • 1970-01-01
              • 1970-01-01
              • 2021-12-11
              • 1970-01-01
              • 1970-01-01
              • 2016-07-29
              • 2011-11-16
              相关资源
              最近更新 更多