2010-11-24 10 views
3

charまたはsubstring検索を開始する開始位置を指定できる関数が見つかりませんでした。開始位置を指定してcharまたはsubstringを検索

I持って、例えば:私は囲まれた部分文字列を「S3」になっ最終的にそれを以下の最初の「*」アスタリスクした後、第2アスタリスクを検索してによって「S3」を検索したい

char *c = "S1S2*S3*S4"; 

それらのアスタリスクによって。

答えて

2

一つの解決策は、最初のアスタリスクの位置、第二のアスタリスクの次に場所を見つけることであろう。これらの位置を開始位置と終了位置として使用してS3を検索します。

+0

は第2のアスタリスクへのポインタを得る方法です。 – cpx

+0

2つのポインタを使用します。 2回目の検索では、最初の検索の結果が使用されます。 char * first、* second;最初の= strchr(c、 '*');第2 = strchr(第1 + 1、 '*'); –

+0

@cpx:C-stringsが動作する方法のため、 'c + 5'は内容が" S3 * S4 "の別の有効なC文字列です。しかし、C++の質問にタグを付けたので、C文字列操作を避け、 'string'クラスを使うことをお勧めします。 – aschepler

9

クラスのクラスは、インデックスを第2引数として持つ大きなファミリーを持っています。 find('*', index)のアプリケーションを繰り返し実行すると、必要な情報が得られます。

std::string s(c); 
std::string::size_type star1 = s.find('*'); 
std::string::size_type star2 = s.find('*', star1 + 1); 
std::string last_part = s.substr(star2 + 1); 
+2

'std :: string :: npos'に対して' star1'と 'star2'をチェックするのが適切でしょう。それ以外の私はこのC++のソリューションをお勧めします。 –

1

使用

char *strchr(const char *str, int ch); 

参照here参照用

+0

2番目のアスタリスクの検索を開始するインデックスを指定することはできません。 – cpx

+0

@cpxはポインタ演算を使用します。もし "p"があなたのcharポインタで "*"が3であれば、 'strchar(p + 2、 '*')' – wheaties

0
#include <string> 

std::string between_asterisks(const std::string& s) { 
    std::string::size_type ast1 = s.find('*'); 
    if (ast1 == std::string::npos) { 
     throw some_exception(); 
    } 
    std::string::size_type sub_start = ast1+1; 
    std::string::size_type ast2 = s.find('*', sub_start); 
    if (ast2 == std::string::npos) { 
     throw some_exception(); 
    } 
    return s.substr(sub_start, ast2-sub_start); 
} 
0

strchr()を使用できます。返されたポインタを保存して、次の呼び出しに渡すだけです。このポインタがあなたの検索の出現を指しているので、そこから検索が始まります。

0

も一つの可能​​性 - あなたはCスタイルの文字を使用するようにしている場合*文字列の配列 - 例えば、アスタリスクの発生を検索するstrchrを使用することです(とNOエラーチェックと、心)

char c []= "S1S2*S3*S4"; 

char* first = strchr(c,'*'); 
if (first) { 
    char* start = ++first; 
    char* nextast = strchr(start,'*'); 
    char* s3str = new char[nextast-start+1]; 
    strncpy(s3str,start,nextast-start); 
    s3str[next-start] = '\0'; 
} 

これを行うには、C++文字列クラスを使用する方が簡単です。

関連する問題