2016-06-25 1 views
1

文字列のスペースを「*」に置き換えて定義した文字列があります。例:ライブラリのみを使用して文字列内の単語を検索するiostreamとcstring

suffix*i*am*using*stackoverflow*text1suffix*text2suffix 

文の最初の単語は「接尾辞」です。私がする必要があるのは、文章をstrtokを使って別々の単語に分けて、の末尾がのすべての単語を出力することです。出力は次のようになります。

text1suffix, text2suffix 

トリッキーな部分は、私が唯一のライブラリにをCStringののiostreamを使用してこれを行うために必要があるということです。私が何をしたか

#include <iostream> 
#include <cstring> 

using namespace std; 

int main() { 
    char s[256], t[256], *p, l, ok; 

    strcpy(s, "suffix*i*am*using*stackoverflow*text1suffix*text2suffix"); 
    p = strtok(s, "*"); 
    strcpy(t, p); 
    l = strlen(p); 
    p = strtok(NULL, "*"); 

    while(p) { 
     ok = 1; 
     for(int i = strlen(p)-1; i >= 0; i--) { 
      if(l-(strlen(p)-i) > 0) {} else break; 
      if(p[i] == t[l-(strlen(p)-i)]) { } 
      else { ok = 0; break; } 
     } 
     if(ok == 1) cout << "*" << p; 

     p = strtok(NULL, "*"); 
    } 
    return 0; 
} 

は(最後の1から始まる)すべての単一の文字をチェックして、彼らは最初の単語と同じであるかどうかを確認です:

は、これは私のコードです。

質問は次のとおりです。少ない労力でこれを行う方法はありますか?あるいは、この問題を解決する他の方法がありますか?私の方法は良くないように感じる。

+2

「strcmp」が役に立ちます – tkausl

+0

私に例を挙げてもらえますか? – Radu

+0

[ここにある](http://en.cppreference.com/w/c/string/byte/strcmp) –

答えて

0

問題は次のとおりです。少ない労力でこれを行う方法はありますか?

まず、変数に適した命名規則を使用することを強くおすすめします。 ltなどの名前には、その内容が記述されていません。このような何か:あなたの内側のforループに関しては

char *suffix = strtok(s, "*"); 
int suffixLength = strlen(suffix); 

strstr関数は、文字列内の文字列を発見する作業を行うことから、このようなループを記述する必要はありません。

char *found = strstr(p, suffix);

これはNULLを返さない場合は、あなたがnullで終わる文字列を扱っているので、見つけ"suffix"文字列を超えた文字は、ヌル・ターミネータであるかどうかをテストすることができます。見つかった接尾辞の後の文字が\0でない場合、文字列が接尾辞ストリングで終わらないことがわかります。

if (found && *(found + suffixLength) == '\0') // the suffix must be found, and it must occur at the end of the string. 
{ 
    // ends with the suffix string. 
} 

さらに、strlenを同じcharバッファーに複数回呼び出しています。それは非常に無駄です。

この情報があれば、strlenへの不要な呼び出しなしで「より良い」ループをまとめることができます。

関連する問題