2012-04-18 10 views
0

regexライブラリを使わずに文字列が "さようなら"で終わるかどうかを知る方法はありますか?正規表現ライブラリなしのシンプルな正規表現ですか?

多分strcpy、strlen、eccを使用します。

+1

がC++スタイルの 'のstd :: STRING'、またはCスタイルの'のchar * 'あなたの文字列です? – Bojangles

+5

C関数を提案して以来、私はあなたがC言語でプログラミングしているのではないかと疑います。C++の答えを探しているのでなければ、C++のタグを削除する必要があります。 –

+0

@R ..:その場合、Cタグを削除する必要がありますか? ;) – PlasmaHH

答えて

5
str.length() >= 7 && str.substr(str.length() - 7) == "goodbye" 

それともstring::substrが行うよう、それは新しい文字列を割り当てていないので、あなたはおそらく、より効率的であるboost::ends_withを、使用することができます。

私はこのような標準ライブラリのバージョンがもう少し効率的に作ることができます:

str.length() >= 7 && std::equal(str.end() - 7, str.end(), "goodbye"); 

は実は、今、私はそれを入力したことを、私はそれが私はそれが可能だろうと思ったほど面倒ではありません実現するので、それはすべきおそらく最初のバージョンより優先されるでしょう。

+0

str.compare(str.length() - 7,7、 "さようなら")== 0も可能です – stefan

3

はい、それは可能だし、それは2つの段階取り:長さを取得していない場合、それは、一致少なくとも7ませんかどうかを確認するために使用strlen

  1. を。
  2. 長さを使用して、文字列の最後の7文字を調べ、strcmpを使用して比較します。 Cでは
+0

私は最後の7文字を抽出するために使用する必要がありますか? ありがとう:D – xRobot

+1

+と - 演算子。 –

+1

より具体的には、 'str + len-7'は最後の7文字を指します。 (しかし、これは長さが7以上の場合にのみ有効です。そうでなければ、減算は範囲外であり、結果として未定義の動作になります)。 –

2
#include <string> 

int main(void) { 
    std::string a="hellogoodbye"; 
    size_t pos = a.rfind("goodbye"); 
    if(pos != string::npos && pos == a.length() - 7) std::cout << "true"; 
} 
+0

これは機能しますが、興味があるときには、最後の数文字で –

2

:C++で

bool ends_with(char const * string, char const * ending) { 
    size_t const slen = strlen(string); 
    size_t const elen = strlen(ending); 
    return slen >= elen && memcmp(string+slen-elen, ending, elen) == 0; 
} 

bool ends_with(std::string const & string, std::string const & ending) { 
    return string.length() >= ending.length() && 
      std::equal(ending.rbegin(), ending.rend(), string.rbegin()); 
}