文字列のすべての文字


229

C ++で文字列のすべての文字に対してforループを実行するにはどうすればよいですか?


9
どんなひも?Cストリング、またはstd::string
ミスティック

テキストファイルから読み込まれるため、std ::
Jack Wilsdonを

4
どんなキャラクター?char、Unicodeコードポイント、拡張書記素クラスター?
Philipp

文字列を反復処理し、インデックス(現在の位置)を確認するにはどうすればよいですか?index答えの部分については心配しないでください。
jww 2014年

回答:


417
  1. ループする文字std::string使用して、範囲ベースのループ(まだGCC、打ち鳴らすの最近のリリースではサポートされ、C ++から11だ、とVC11ベータ)のために:

    std::string str = ???;
    for(char& c : str) {
        do_things_with(c);
    }
  2. std::stringイテレータでaの文字をループする:

    std::string str = ???;
    for(std::string::iterator it = str.begin(); it != str.end(); ++it) {
        do_things_with(*it);
    }
  3. std::string昔ながらのforループでaの文字をループする:

    std::string str = ???;
    for(std::string::size_type i = 0; i < str.size(); ++i) {
        do_things_with(str[i]);
    }
  4. nullで終了する文字配列の文字をループする:

    char* str = ???;
    for(char* it = str; *it; ++it) {
        do_things_with(*it);
    }

4
@ロビンソン:それは間違った仮定です。非常に誤った仮定。また、「文字」にはさまざまな意味があるため、この用語は厳密に回避することをお勧めします。
パピー14

6
@Robinson:"std :: string is UTF8( assumed tomated "いつから?!
オービットの軽さのレース

2
ええ、わかりました。エンコードはありませんが、現在(特にWeb上)のutf8が広く利用されており、この議論の基礎として、パイプラインまたはアプリケーション全体で単一の一貫したエンコードが必要になる可能性があるという事実が私のstd :: stringsです。すべてutf8:pです。
ロビンソン

4
@Robinson:そして、ユーザー向けドメインでプログラミングしていないため、私のすべてがエンコーディングなしとして扱われています(つまり、人間にレンダリングされる予定の文字列はありません)。文字エンコーディングについて説明したい場合は、一連のバイトであるの上位の 抽象化について説明する必要がstd::stringあります。
Orbitでの軽さのレース

1
また、ケース2と3は、「auto」を使用できる/使用するべき良い例です
ガロア

29

forループは次のように実装できます。

string str("HELLO");
for (int i = 0; i < str.size(); i++){
    cout << str[i];
}

これにより、文字列が文字ごとに出力されます。str[i]インデックスの文字を返しますi

文字配列の場合:

char str[6] = "hello";
for (int i = 0; str[i] != '\0'; i++){
    cout << str[i];
}

基本的に上記の2つは、c ++でサポートされる2つのタイプの文字列です。2つ目はc文字列と呼ばれ、1つ目はstd文字列または(c ++文字列)と呼ばれます。c++文字列を使用することをお勧めします。


24

最新のC ++では:

std::string s("Hello world");

for (char & c : s)
{
    std::cout << "One character: " << c << "\n";
    c = '*';
}

C ++ 98/03の場合:

for (std::string::iterator it = s.begin(), end = s.end(); it != end; ++it)
{
    std::cout << "One character: " << *it << "\n";
    *it = '*';
}

読み取り専用の反復ではstd::string::const_iterator、C ++ 98、for (char const & c : s)またはfor (char c : s)C ++ 11でのみ使用できます。


C ++ 11を部分的にサポートするコンパイラのオプションをいくつか示します。pastebin.com
Benjamin Lindley

@BenjaminLindley:ありがとう!auto常に良い考えです。それを使用する場合は、間の違いbegin()とはcbegin()関連になります。
Kerrek SB、2012

2
ここでchar内の参照の役割は何char & cですか()?必要な場合に文字値を変更できるようにするだけですか?
LunaticSoul 2015年

11

これは、標準アルゴリズムを使用して行う別の方法です。

#include <iostream>
#include <string>
#include <algorithm>

int main()
{
   std::string name = "some string";
   std::for_each(name.begin(), name.end(), [] (char c) {
      std::cout << c;
   });
}

私たちは2018年を迎えているので、これが正解です。
rwst

7
const char* str = "abcde";
int len = strlen(str);
for (int i = 0; i < len; i++)
{
    char chr = str[i];
    //do something....
}

4
(古くなったコメント、それでもおそらくOPに関連があります:) strlenループ全体でO(n ^ 2)文字列のサイズ。strlenループ中に文字列が変更された場合、ループ条件を呼び出すことができますが、実際に必要な場合のために予約しておく必要があります。
Magnus Hoff

@MagnusHoff:うん、画家のシュレミエルは醜い頭をもう一度育てた。
Fred Larson、

回答を編集しました。Magnusの
とおり

ただし、すべての反復でnullをテストするよりも、ループの外側でstrlen()を使用する必要があります。
mckenzm

4

「c文字列」を使用した範囲ベースのforループを使用した例はありません。

char cs[] = "This is a c string\u0031 \x32 3";

// range based for loop does not print '\n'
for (char& c : cs) {
    printf("%c", c);
}

関連していませんが、int配列の例

int ia[] = {1,2,3,4,5,6};

for (int& i : ia) {
    printf("%d", i);
}

1

C-string(char [])の場合は、次のようにする必要があります。

char mystring[] = "My String";
int size = strlen(mystring);
int i;
for(i = 0; i < size; i++) {
    char c = mystring[i];
}

以下のためstd::stringに使用できるstr.size()例のように、そのサイズと反復を取得するには、イテレータを使用することができます。

std::string mystring = "My String";
std::string::iterator it;
for(it = mystring.begin(); it != mystring.end(); it++) {
    char c = *it;
}

1
for (int x = 0; x < yourString.size();x++){
        if (yourString[x] == 'a'){
            //Do Something
        }
        if (yourString[x] == 'b'){
            //Do Something
        }
        if (yourString[x] == 'c'){
            //Do Something
        }
        //...........
    }

文字列は基本的に文字の配列であるため、文字を取得するためのインデックスを指定できます。インデックスがわからない場合は、上記のコードのようにループできますが、比較を行う場合は、単一引用符(文字を指定する)を使用していることを確認してください。

それ以外は、上記のコードは自明です。


-1

文字列ライブラリのat関数を使用して、文字列のすべての文字を取得できます。

string words;
    for (unsigned int i = 0; i < words.length(); i++)
        {
            if (words.at(i) == ' ')
            {
                spacecounter++;    // to count all the spaces in a string
                if (words.at(i + 1) == ' ')
                {
                    i += 1;
                }

これは私のコードのほんの一部ですが、ポイントはあなたが文字にアクセスできることです stringname.at(index)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.