2016-11-30 21 views
-3

ライブラリ関数を使用せずに単純な方法で文字列から句読点や空白を削除するにはどうすればよいですか?C++は文字列から句読点と空白を削除します

ライブラリI/Oなどの <iostream>std::stringのようなタイプを使用することができますし、あなただけの ispunct()よう <cctype>機能を使用したくないと仮定すると、
+2

"write head"と "read head"の2つの位置を追跡しながら、文字列をループします。読取りヘッドが句読点に当たった場合、書込みなしで前方にスキップします。それ以外の場合は、読み取りヘッドから書き込みヘッドにコピーし、両方を前方に移動します。 – BoBTFish

+1

標準ライブラリも禁止されていますか?そしてstd :: string?句読点は「?、;:?!」だけですか?または英数字ではないものは何ですか? – stefaanv

+0

@stefaanv英数字でないもの – lola96

答えて

0
int main() 
{ 
    string s = "abc de.fghi..jkl,m no"; 
    for (int i = 0; i < s.size(); i++) 
    { 
     if (s[i] == ' ' || s[i] == '.' || s[i] == ',') 
     { 
      s.erase(i, 1); // remove ith char from string 
      i--; // reduce i with one so you don't miss any char 
     } 
    } 
    cout << s << endl; 
} 
+0

'std :: string :: operator []'はライブラリ関数なので、このコードはライブラリ関数を使用しないという要件を満たしていません。

1

パフォーマンスについては考えられませんが、私はそれが複数のより良い方法で実行できると確信しています。

+0

ええと、(明らかに人為的な)制約は、**どの**ライブラリ関数も使用しないことです。 'std :: string'のコンストラクタはライブラリ関数です。 そして、舞台裏では、forループは 'std :: string :: begin()'と 'std :: string :: end()'を使用します。これらもライブラリ関数です。 –

+1

次に、Cスタイルに行き、配列を使うかもしれないので、 'strlen()'や 'strcat()'や 'printf()'のような関数を使わなくてはなりません。私は彼の要求が厳しいとは思っていませんが、彼は推測を精緻化しなかったので、私たちは決して知らないでしょう。 – sharyex

+0

私は、 'strlen'と' strcat'の等価なものを書くことがポイントだと思っています。彼らはそれほど難しいことではありません。一方、 'printf'は、... –

関連する問題