1

CIで少しプログラミングした後、すぐにC++にジャンプすることにしました。最初は、文字列クラスが存在し、文字列を文字の配列ではなく全体の単位として扱うことができることに満足していました。しかし、Cスタイルの文字列には、プログラムがポインタ演算を使用して文字ごとに移動し、目的の論理演算を実行できるという利点があることがすぐにわかりました。

私は今これを必要とする状況にいることに気づきましたが、コンパイラは文字列型からCスタイルの文字列に変換できないと言っています。だから私は疑問に思っていました、単一の文字を参照するためにポインタ演算を使用する方法、または文字の配列を作成することなく文字列クラスを使用しながら最初の文字のアドレスとして関数に引数を渡す方法はありますか?私のケーキを持ってそれも食べますか?

4

2 に答える 2

4

&your_string[0]文字列の最初の文字へのポインタを取得するために使用できます。your_string.begin()また、ほとんどポインタのように扱うことができる文字列にイテレータを取得するために使用することもできます(逆参照、算術演算など)。

しかし、あなたが達成しようとしていることについてもっと私たちに話したほうがいいかもしれません。ポインタを使用するよりも良い方法がある可能性はかなり高いです。

編集:文字列内の母音の数を数えるようなものについては、ほぼ確実にアルゴリズムを使用する必要があります-この場合、std::count_ifおそらく最も適切です:

struct is_vowel {
    bool operator()(char ch) { 
        static const char vowels[] = "aeiouAEIOU";
        return strchr(vowels, ch) != NULL;
    }
};

int vowels = std::count_if(my_string.begin(), my_string.end(), is_vowel());

まだを使用していますbegin()が、ポインタ(のような)演算は行っていません。

于 2011-02-26T22:00:06.253 に答える
4

文字列文字には、インデックス、ポインタ、およびイテレータを使用してアクセスできます。

イテレータを使用する場合は、文字列にスペースが含まれているかどうかをチェックする関数を作成できます。

bool spacecheck(const string& s)
{
    string::const_iterator iter = s.begin();
    while(iter != s.end()){
        if (isspace(*iter))
            return true;
        else
            ++iter;
    }
}

関数の先頭で、 .begin()関数を使用して、イテレータを文字列sの先頭に初期化しました。この場合、イテレータは文字列の最初の文字に戻ります。while関数では、条件はiter!= s.end()です。この場合、 end()は、文字列の最後の文字の後の要素を参照するイテレータに戻ります。本文では、iterが指す値である(* iter)が関数isspace()に送信され、文字がスペースであるかどうかがチェックされます。失敗すると、iterがインクリメントされ、文字列の次の要素を指すようになります。

私は自分でc++を学んでおり、これらすべてを書き出すことで、私自身の理解に役立っています。これがすべてあなたにとって非常に単純に思えたとしても、私があなたを怒らせなかったことを願っています。私はただ簡潔にしようとしていました。

私は現在Acceleratedc++から学んでいますが、あまりお勧めできませんでした。

于 2011-02-26T22:34:00.817 に答える