2

こんにちは、文字列 str1 を文字列 str2 と同等に見せる最短の方法は何だろうと思っていました

str1 = "Front Space";
str2 = " Front Space";

/*Here is where I'm missing some code to make the strings equal*/

if (str1.compare(str2) == 0) { // They match 
    cout << "success!!!!" << endl; // This is the output I want
}

str1 が str2 と等しくなるために必要なのは、どうすればよいですか?

複数の試行を行いましたが、すべてが正しく機能していないようです。文字列の文字数が原因だと思います。つまり、str1の文字数はstr2よりも少ないです。

for (int i = 1; i <= str1.length() + 1; i++){
    str1[str1.length() - i ] = str1[str1.length() - (i + 1)];
}

どんな助けでも大歓迎

4

3 に答える 3

6

Boost を使用できる場合、trim 関数はboost/algorithm/string.hppで利用できます。

str1 = "Front Space";
str2 = " Front Space";
boost::trim_left( str2 ); // removes leading whitespace

if( str1 == str2 ) {
  // ...
}

同様に、trim先頭と末尾の両方の空白を削除するものがあります。そして、これらすべての関数には*_copy、元の文字列を変更するのではなく、トリミングされた文字列を返す対応する関数があります。


Boost を使用できない場合でも、独自のtrim_left関数を作成することは難しくありません。

#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>

void trim_left( std::string& s )
{
  auto it = s.begin(), ite = s.end();

  while( ( it != ite ) && std::isspace( *it ) ) {
    ++it;
  }
  s.erase( s.begin(), it );
}

int main()
{
  std::string s1( "Hello, World" ), s2( " \n\tHello,   World" );

  trim_left( s1 ); trim_left( s2 );

  std::cout << s1 << std::endl;
  std::cout << s2 << std::endl;
}

出力:

Hello, World
Hello,   World
于 2012-10-16T01:33:29.387 に答える
1

LLVM には、 StringRefクラスのいくつかのトリム メンバー関数もあります。これは、重要な場合に備えて、文字列を変更したり、コピーを作成したりせずに機能します。

llvm::StringRef ref1(str1), ref2(str2);
ref1.ltrim();
ref2.ltrim();
if (ref1 == ref2) {
    // match
}
于 2012-10-16T01:43:24.033 に答える
1

他の人が言ったように、あなたは使うことができますboost。を使いたくない場合boost、または使えない場合 (宿題のためか)、簡単に ltrim 関数を作成できます。

string ltrim(string str)
{
    string new_str;
    size_t index = 0;

    while (index < str.size())
    {
        if (isspace(str[index]))
            index++;
        else
            break;
    }

    if (index < str.size())
        new_str = str.substr(index);

    return new_str;
}
于 2012-10-16T01:37:42.213 に答える