18

それは私ですか、それとも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 << Trim( "\ n \ r \ r \ n \ r\nここにテキスト\nreturn\ n \ r \ r \ n \ r \ n"); -編集-私は主にそれが標準ライブラリになかった理由を知りたいと思っていました、BobbyShaftoeの答えは素晴らしいです。トリムは標準の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()実装が文字列を受け取り、文字列を返す限り、それがどこで定義されているかは実際には気にしません。したがって、標準ライブラリでは実際には必要ありません。他のライブラリから簡単に提供できます。

対照的に、文字列クラスやベクトルのようなものは、標準ライブラリが提供する必要のあるクラスです。カスタム文字列クラスを使用する場合、そのライブラリの文字列操作のみが機能するためです。標準ライブラリ文字列を使用すると、サードパーティのライブラリがこの共通の文字列定義をターゲットにでき、誰もが勝ちます。

最後の基準が出たとき、ハーブサッターはこれを非常によく説明する投稿をここに書きまし

もちろん、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()を使用すると、1つのスペースが任意の数の空白文字と一致していました。

これが、 fgets()の後にsscanf()を使用した理由です。その空白の一部として改行が一致しないようにするため。

于 2009-01-26T09:15:23.213 に答える
1

' '主な理由は、空白の定義がかなり狭いためだと思います。たとえば、私も関数によって削除したいL' 'と思います。ただし、そのような洞察を持っているのはロケールライブラリだけです。L' 'trim()

同じ理論的根拠が、一般的に要求されるto_upperおよびメソッドにも当てはまります。ASCII で通常使用される典型的なマッピングにto_lower反対する人が (特にトルコで) います。c &= ~0x20;

于 2011-03-25T16:20:45.310 に答える
0

VC++ を使用できます。CString クラスにはトリム機能があります。:D

于 2009-05-07T09:29:16.310 に答える