2016-10-08 12 views
-3

文字列の先頭と末尾にある特定の不要文字を削除する関数を作成する必要があります。別の文字列に格納されていない最初の文字列を確認する(C++)

私は find_first_of文字列関数にSUBSTRを使用して、そうする必要がある例)&#する@%)アルファベットスープ)()%アルファベットスープ

を生成すると、 find_last_ofと、削除する必要がある文字を含む文字列。 私はこのコード行でそうしようとした:

temp = temp.substr(temp.find_first_of(!badchars), temp.find_last_of(!badchars)); 

しかし、言ったエラーを与え++グラム!私は文字列で使用できる演算子ではありません。 私は何を求めているのでしょうか、私はこれらのパラメータでこれを行う方法はありますか?

+0

確かに方法があります。なぜあなたはすでに自分自身を試していたのですか?どのように失敗しましたか? [MCVE]を投稿してください(エラーメッセージはそのまま) –

+1

'!badchars'はあなたが思っていることをしません。 –

+0

あなたが知っている、 '!badcharsはあまりにも悪いアイデアではありません。残念ながら、言語はまだあなたに追いついていません。あなたは「goodchars」でそれをすることができますが、それは構築するのは面倒です。代わりに['find_first_not_of'](http://en.cppreference.com/w/cpp/string/basic_string/find_first_not_of)を試してみてください。 – user4581301

答えて

1

まず、これが動作しない理由の説明:

String.find_first_ofは、入力として、Cスタイルの文字列(文字の配列)をとる関数です。 !を追加することで何をしたいのですか?あなたのリストにない文字を見つけるように関数に指示しますが、そうするには、すべての可能なUnicode文字のリストから始め、 badchars list。また、文字列は通常可能な文字のリストではなく、文字列であるため、コンパイラが意味することを知る方法はありません。したがって、!badcharsは、容易にstring is nullまたはreverse stringを意味することができます。 C++では、!演算子は文字列に対しても定義されていないため、コンパイラはそれに不満を持ちます。

2番目:解決策。あなたが何をしたいか

は使用find_first_not_offind_last_not_ofですが、あなたは、あなたがこれらを使用することになっていないことに言及します。代わりに、あなたがする必要があるのは、一度に文字列の先頭に移動し、badlistに文字が見えなくなるまでです。これを行うには、最初の番号の返りを止めるまで、find_first_ofという2番目の引数をインクリメントします。

// find the character immediately after any initial sequence of bad characters. 
int start = 0; 
while(temp.find_first_of(badlist, start) == start){start++;} 
// now start is the index of the first character not in our list. 

これで目的の出力が開始されましたが、まだ終了を見つける必要があります。これを行うには、基本的には上記と同じように逆に行います。この時点で

// find the character immediatly preceding the last sequence of bad characters 
int end = temp.length - 1; // last index of the string 
while(temp.find_last_of(badlist, end) == end){end--} 

我々は出力に、少なくともいくつかの文字を含む文字列のための望ましい出力のstartendを持っています。私は文字列が完全にbadlistの文字で構成されているかどうかを判断するロジックを残します。

0

あなたのアルゴリズムは

です。削除セットに文字がある間は、文字列から文字を削除します(インクリメントポインタ)。 文字列の最後をポイントします。 (注意してください、それは空文字列かもしれません)。文字列に文字があり、削除セットに文字が入っていますが、文字列から文字を削除します(デクリメントポインタ)。

ここで、トリムされた文字列をデリートする2つのポインタstartとendがあります。

私は "ポインタ"という言葉を使用しましたが、整数はうまくいくでしょう。コードは、c関数strchr()を使用して非常に単純かつ自然に記述し、それをremove setで呼び出すことができます。

関連する問題