2016-12-10 2 views
0

2つのストリングS1 = "zzzzabra"S2 = "abracadabra"があるとします。C++サブストリングのアドレスを取得する

例えば、S1[4:8]S2の接頭辞であることを知りたいと思います。

私はちょうどサブストリングS1.substr(4,4)を得て、いくつかのプレフィックステスト関数に渡すことができます。

しかし、私は文字列を変更しないので、コピーを渡すのは好きではなく、開始する場所のアドレスだけを渡したいと思います。

可能ですか?たとえば、ある比較機能がある場合​​、S1[4:8]の接頭辞がS2かどうかを確認するにはどうすればいいですか?

私はこの比較作業を何度もやりますが、私は不要なコピーで時間を無駄にしてはいけないと思います。また、コードをきれいにしたいので、最初はこのトリックを行うために関数に多くのパラメータを入れたくありません。

+0

あなたはそれが始まる場所へのポインタを渡すことができます何通りの文字があるのでしょうか。 – SenselessCoder

+0

ええ、私が言ったように、最初は2つのパラメータがあればそれがほしいと思っています...この方法でこのトリックをすることができないなら、それにいくつかのパラメータ – Daniel

+0

@ダニエル: 2つのパラメータだけが必要な場合、関数はどのように4または8を知るべきですか?または、関数内で4と8をハードコーディングしますか? –

答えて

2
string str1 = "abcdwgyz"; 
string str2 = "wxyzpqrs"; 

return (str1.compare(4, 4, str2.substr(0, 4)) == 0); 
+1

'substr'は必要ありません:' return(str1.compare(4、4、str2、0、4)== 0); ' –

0

C関数:はstrstr()、多分(strcmpのを確認してください)[Cから]

C++文字列関数:彼らはちょうどアドレスを取り、両方の()

を比較します。

c_str()を使用してC++文字列をC文字列に変換してください。

+0

私は何度か比較しようとしましたが、私がパラメータとして与えたものであっても-1を返すだけでした。 'S1 [4:8]'が 'S2'の接頭辞であるかどうかを比較するにはどのようにすればよいですか? 'S1> S2'の場合を扱うのだろうか? – Daniel

+0

Cからstrcmp()を試してください。 C++文字列をC文字列に変換してください。彼らは同じではありません! – Ehsan

+0

Cのstrcmp()は>、<または==を扱います – Ehsan

1

しかし、問題がある:私は、文字列を変更しないように、私はコピーを渡す したいが、それは例えば、どこから始まるの単なるアドレスではないでしょう。

まず、それは早すぎる最適化です。コピーセマンティクスについてはあまり心配しないでください。

第2に、アドレスではなくイテレータの観点から考えます。 begin()end()のような関数を使ってランダムアクセスイテレータを文字列要素に渡すことができれば、標準のC++アルゴリズムのすべてを自由に使えます。

std::searchのような音がします。次に例を示します。

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

int main() 
{ 
    std::string const S1 = "zzzzabra"; 
    std::string const S2 = "abracadabra"; 

    using std::begin; 
    using std::end; 

    auto const result = std::search(
     begin(S2), 
     end(S2), 
     begin(S1) + 4, 
     begin(S1) + 8 
    ); 

    if (result == begin(S2)) 
    { 
     std::cout << "prefix\n"; 
    } 
} 

注によるstd::searchstd::beginstd::endの一般的な性質のために、これもchar const[]で動作していること:

char const S1[] = "zzzzabra"; 
char const S2[] = "abracadabra"; 
関連する問題