Per ogni personaggio nella stringa


229

Come farei un ciclo for su ogni carattere nella stringa in C ++?


9
Che tipo di stringa? C-string o std::string?
Mistico il

È letto in un file di testo, quindi presumo std ::
Jack Wilsdon,

4
Che tipo di personaggio? char, Punto di codice Unicode, cluster grapheme esteso?
Philipp,

Possibile duplicato di Come posso scorrere una stringa e conoscere anche l'indice (posizione corrente)? . Non preoccuparti per la indexparte nelle risposte.
jww

Risposte:


417
  1. Scorrendo i caratteri di a std::string, usando un loop basato su range (è di C ++ 11, già supportato nelle recenti versioni di GCC, clang e VC11 beta):

    std::string str = ???;
    for(char& c : str) {
        do_things_with(c);
    }
    
  2. Scorrendo i personaggi di a std::stringcon iteratori:

    std::string str = ???;
    for(std::string::iterator it = str.begin(); it != str.end(); ++it) {
        do_things_with(*it);
    }
    
  3. Ripercorrendo i personaggi di a std::stringcon un for-loop vecchio stile:

    std::string str = ???;
    for(std::string::size_type i = 0; i < str.size(); ++i) {
        do_things_with(str[i]);
    }
    
  4. Scorrendo i caratteri di una matrice di caratteri con terminazione null:

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

4
@Robinson: è un'ipotesi errata. Un presupposto molto errato. Inoltre, "personaggio" ha tanti significati diversi, è meglio evitare rigorosamente il termine.
Cucciolo

6
@Robinson: "std :: string è UTF8 (si presume che sia) " Da quando ?!
Corse di leggerezza in orbita,

2
Bene, OK, non ha alcuna codifica, tuttavia data l'ubiquità di utf8 ora (specialmente sul web) e il fatto che si potrebbe desiderare un'unica codifica coerente attraverso una pipeline o un'applicazione, per la base di questa discussione il mio std :: stringhe sono tutti utf8: p.
Robinson,

4
@Robinson: E tutti i miei sono trattati senza codifica perché non sto programmando in un dominio rivolto all'utente (ovvero, non ci sono stringhe destinate a essere rese agli umani). Se vuoi parlare di codifiche dei personaggi, devi anche parlare di un'astrazione di livello superiore std::string , che è solo una serie di byte.
Razze di leggerezza in orbita,

1
inoltre, i casi 2 e 3 sono un buon esempio di dove puoi / dovresti usare "auto"
galois,

29

Un ciclo for può essere implementato in questo modo:

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

Questo stamperà il carattere stringa per carattere. str[i]restituisce carattere all'indice i.

Se si tratta di una matrice di caratteri:

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

Fondamentalmente sopra due sono due tipi di stringhe supportate da c ++. Il secondo si chiama stringa c e il primo si chiama stringa std o (stringa c ++). Suggerirei l'uso di stringa c ++, molto facile da gestire.


24

Nel moderno 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 = '*';
}

Per l'iterazione di sola lettura, è possibile utilizzare std::string::const_iteratorin C ++ 98 e for (char const & c : s)o semplicemente for (char c : s)in C ++ 11.


Ecco un paio di opzioni per i compilatori con supporto C ++ 11 parziale: pastebin.com/LBULsn76
Benjamin Lindley

@BenjaminLindley: grazie! autoè sempre una buona idea. Quando lo si utilizza, la distinzione tra begin()e cbegin()diventa rilevante.
Kerrek SB,

2
qual è il ruolo del riferimento in carattere qui ( char & c)? È solo per consentire la modifica del valore del carattere nel caso sia necessario?
LunaticSoul,

11

Ecco un altro modo di farlo, usando l'algoritmo standard.

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

Abbiamo l'anno 2018, quindi questa dovrebbe essere la risposta corretta.
primo

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

4
(Commento obsoleto, che probabilmente è ancora rilevante per l'OP :) Non è considerato una buona forma da utilizzare strlennella condizione del ciclo, poiché richiede un'operazione O (n) sulla stringa per ogni iterazione, rendendo l'intero ciclo O (n ^ 2) nella dimensione della stringa. strlennella condizione del ciclo può essere richiesto se la stringa cambia durante il ciclo, ma dovrebbe essere riservata ai casi in cui è effettivamente richiesta .
Magnus Hoff,

@MagnusHoff: Sì, Schlemiel il Pittore si rialza di nuovo la brutta testa.
Fred Larson,

Ho modificato la mia risposta. Magnus hai ragione, oops ho usato foreach in c # negli ultimi due anni;)
demoncodemonkey

Dovresti comunque usare strlen () al di fuori del ciclo, preferendo testare null in ogni iterazione.
mckenzm,

4

Non vedo alcun esempio utilizzando un intervallo basato su loop con una "stringa c".

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

esempio di array non correlato ma int

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

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

1

Per C-string ( char []) dovresti fare qualcosa del genere:

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

Perché std::stringpuoi usare str.size()per ottenere le sue dimensioni e iterare come nell'esempio, oppure puoi usare un iteratore:

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

Una stringa è sostanzialmente una matrice di caratteri, quindi è possibile specificare l'indice per ottenere il carattere. Se non conosci l'indice, puoi scorrere attraverso di esso come il codice sopra, ma quando fai un confronto, assicurati di usare virgolette singole (che specificano un carattere).

A parte questo, il codice sopra è autoesplicativo.


-1

puoi ottenere ogni carattere in una stringa usando la funzione at della libreria di stringhe, come ho fatto in questo modo

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

questo è solo un segmento del mio codice ma il punto è che puoi accedere ai caratteri di stringname.at(index)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.