web-dev-qa-db-ja.com

文字列内のすべての文字について

C++では、文字列内のすべての文字に対してforループをどのように実行しますか?

199
Jack Wilsdon
  1. 範囲ベースのforループを使用してstd::string文字 をループ処理する(C++ 11以降、GCCの最近のリリースですでにサポートされている、clangそして、VC11ベータ版):

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

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

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

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

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

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

これは文字列を1文字ずつ表示します。 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 ++文字列)と呼ばれます。

27
user1065734

現代の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 = '*';
}

読み取り専用の繰り返しの場合は、C++ 98ではstd::string::const_iterator、C++ 11ではfor (char const & c : s)または単にfor (char c : s)を使用できます。

24
Kerrek SB

これを行うもう1つの方法は、標準のアルゴリズムを使用することです。

#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;
   });
}
9
0xBADF00
const char* str = "abcde";
int len = strlen(str);
for (int i = 0; i < len; i++)
{
    char chr = str[i];
    //do something....
}
7
demoncodemonkey

"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);
}
3
10SecTom
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
        }
        //...........
    }

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

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

1

C文字列(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