it-swarm.com.de

Für jedes Zeichen in einer Zeichenfolge

Wie würde ich in C++ eine for-Schleife für jedes Zeichen in einer Zeichenfolge ausführen?

203
Jack Wilsdon
  1. Durchlaufen Sie Zeichen einer std::string mit einer bereichsbasierten for-Schleife (aus C++ 11, das bereits in neueren Versionen von GCC, Clang und der Beta-Version von VC11 unterstützt wird):

    std::string str = ???;
    for(char& c : str) {
        do_things_with(c);
    }
    
  2. Durchlaufen Sie die Zeichen eines std::string mit Iteratoren:

    std::string str = ???;
    for(std::string::iterator it = str.begin(); it != str.end(); ++it) {
        do_things_with(*it);
    }
    
  3. Durchlaufen Sie die Zeichen eines std::string mit einer altmodischen for-Schleife:

    std::string str = ???;
    for(std::string::size_type i = 0; i < str.size(); ++i) {
        do_things_with(str[i]);
    }
    
  4. Durchlaufen der Zeichen eines nullterminierten Zeichenarrays:

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

Eine for-Schleife kann folgendermaßen implementiert werden:

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

Dadurch wird die Zeichenfolge zeichenweise gedruckt. str[i] gibt das Zeichen am Index i zurück.

Wenn es sich um ein Zeichenarray handelt:

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

Grundsätzlich über zwei sind zwei Arten von Zeichenfolgen, die von c ++ unterstützt werden. Die zweite heißt c-Zeichenfolge und die erste heißt std-Zeichenfolge oder (c ++ - Zeichenfolge).

27
user1065734

In modernem C++:

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

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

In C++ 98/03:

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

Für eine schreibgeschützte Iteration können Sie std::string::const_iterator in C++ 98 und for (char const & c : s) oder nur for (char c : s) in C++ 11 verwenden.

24
Kerrek SB

Hier ist eine andere Möglichkeit, den Standardalgorithmus zu verwenden.

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

Ich sehe keine Beispiele, die einen Bereich verwenden, der auf einer for-Schleife mit einer "c-Zeichenfolge" basiert.

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);
}

nicht verwandt, aber Int-Array-Beispiel

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
        }
        //...........
    }

Ein String ist im Grunde ein Array von Zeichen. Daher können Sie den Index angeben, um das Zeichen abzurufen. Wenn Sie den Index nicht kennen, können Sie ihn wie im obigen Code durchlaufen. Wenn Sie jedoch einen Vergleich durchführen, müssen Sie einfache Anführungszeichen (die ein Zeichen angeben) verwenden.

Ansonsten ist der obige Code selbsterklärend.

1

Für C-String (char []) solltest du ungefähr so ​​vorgehen:

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

Für std::string können Sie str.size() verwenden, um die Größe zu ermitteln und wie im Beispiel zu iterieren, oder Sie können einen Iterator verwenden:

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