Para cada caractere na string

229

Como eu faria um loop for em todos os caracteres da string em C ++?

Jack Wilsdon
fonte
9
Que tipo de corda? C-string, ou std::string?
Mysticial
Ele é lido em um a partir de um arquivo de texto, então eu estou supondo que std ::
Jack Wilsdon
4
Que tipo de personagem? char, Ponto de código Unicode, cluster de grafema estendido?
Philipp
Possível duplicata de Como posso percorrer uma string e também conhecer o índice (posição atual)? . Não se preocupe com a indexparte das respostas.
JWW

Respostas:

417
  1. Fazendo um loop nos caracteres de a std::string, usando um loop for baseado em intervalo (é do C ++ 11, já suportado em versões recentes do GCC, clang e VC11 beta):

    std::string str = ???;
    for(char& c : str) {
        do_things_with(c);
    }
  2. Loop pelos caracteres de a std::stringcom iteradores:

    std::string str = ???;
    for(std::string::iterator it = str.begin(); it != str.end(); ++it) {
        do_things_with(*it);
    }
  3. Fazendo um loop pelos caracteres de a std::stringcom um loop for antiquado:

    std::string str = ???;
    for(std::string::size_type i = 0; i < str.size(); ++i) {
        do_things_with(str[i]);
    }
  4. Loop através dos caracteres de uma matriz de caracteres terminados em nulo:

    char* str = ???;
    for(char* it = str; *it; ++it) {
        do_things_with(*it);
    }
R. Martinho Fernandes
fonte
4
@ Robinson: Essa é uma suposição defeituosa. Uma suposição muito defeituosa. Além disso, "personagem" tem tantos significados diferentes, é melhor evitar estritamente o termo.
Filhote de cachorro
6
@ Robinson: "std :: string é UTF8 (supostamente)) " Desde quando ?!
Lightness Races in Orbit
2
Bem, tudo bem, ele não tem codificação, no entanto, dada a onipresença do utf8 agora (especialmente na web) e o fato de que alguém pode querer uma única codificação consistente ao longo de um pipeline ou aplicativo, para a base desta discussão, minhas std :: strings são todos utf8: p.
Robinson
4
Robinson @: E todos os meus são tratados como menos de codificação, porque eu não estou programando em um domínio voltado para o usuário (ou seja, não há seqüências de caracteres destinadas a serem renderizadas aos seres humanos). Se você quiser falar sobre codificações de caracteres, precisa falar sobre uma abstração de nível superior std::string , que é apenas uma série de bytes.
Lightness Races in Orbit
1
Além disso, casos 2 e 3 são bom exemplo de onde você pode / deve usar "auto"
galois
29

Um loop for pode ser implementado assim:

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

Isso imprimirá a sequência de caracteres por caractere. str[i]retorna caractere no índice i.

Se for uma matriz de caracteres:

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

Basicamente acima de dois, existem dois tipos de strings suportados pelo c ++. O segundo é chamado string c e o primeiro é chamado std string ou (c ++ string). Eu sugeriria usar c ++ string, muito fácil de manusear.


fonte
24

No C ++ moderno:

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

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

No C ++ 98/03:

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

Para iteração somente leitura, você pode usar std::string::const_iteratorno C ++ 98 e for (char const & c : s)ou apenas for (char c : s)no C ++ 11.

Kerrek SB
fonte
Aqui estão algumas opções para compiladores com suporte parcial a C ++ 11: pastebin.com/LBULsn76
Benjamin Lindley
@BenjaminLindley: Obrigado! autoé sempre uma boa ideia. Ao usá-lo, a distinção entre begin()e cbegin()se torna relevante.
Kerrek SB
2
qual é o papel da referência em char aqui ( char & c)? É apenas para permitir a modificação do valor do caractere, caso seja necessário?
precisa saber é o seguinte
11

Aqui está outra maneira de fazer isso, usando o algoritmo padrão.

#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;
   });
}
0xBADF00
fonte
Como temos o ano de 2018, essa deve ser a resposta correta.
Rwst
7
const char* str = "abcde";
int len = strlen(str);
for (int i = 0; i < len; i++)
{
    char chr = str[i];
    //do something....
}
demoncodemonkey
fonte
4
(Comentário desatualizado, que provavelmente ainda é relevante para o OP :) Não é considerado uma boa forma de usar strlenna condição de loop, pois requer uma operação O (n) na string para cada iteração, tornando todo o loop O (n ^ 2) no tamanho da string. strlenna condição do loop pode ser solicitada se a sequência for alterada durante o loop, mas deve ser reservada para os casos em que é realmente necessária .
22612 Magnus Hoff
@MagnusHoff: Sim, Schlemiel , o Pintor, levanta a cabeça feia novamente.
Fred Larson
Eu editei minha resposta. Magnus você está certo, oops sido usando foreach em C # para o último par de anos;)
demoncodemonkey
No entanto, você ainda deve usar strlen () fora do loop, em vez de testar nulos em todas as iterações.
Mckenzm
4

Não vejo nenhum exemplo usando um intervalo baseado em loop com uma "string 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);
}

exemplo não relacionado, mas int array

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

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

Para C-string ( char []), você deve fazer algo assim:

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

Pois std::stringvocê pode usar str.size()para obter seu tamanho e iterar como no exemplo, ou pode usar um iterador:

std::string mystring = "My String";
std::string::iterator it;
for(it = mystring.begin(); it != mystring.end(); it++) {
    char c = *it;
}
Tiago Pasqualini
fonte
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
        }
        //...........
    }

Uma String é basicamente uma matriz de caracteres; portanto, você pode especificar o índice para obter o caractere. Se você não conhece o índice, pode repeti-lo como no código acima, mas ao fazer uma comparação, use aspas simples (que especifica um caractere).

Fora isso, o código acima é auto-explicativo.

quase um iniciante
fonte
-1

você pode obter todos os caracteres de uma string usando a função at da biblioteca de strings, como eu fiz dessa maneira

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

este é apenas um segmento do meu código, mas o ponto é que você pode acessar caracteres stringname.at(index)

Shuja Ul Hasan
fonte