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);}
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);}
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]);}
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);}
@ 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 superiorstd::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.
(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);}
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).
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(unsignedint i =0; i < words.length(); i++){if(words.at(i)==' '){
spacecounter++;// to count all the spaces in a stringif(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)
std::string
?char
, Ponto de código Unicode, cluster de grafema estendido?index
parte das respostas.Respostas:
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):Loop pelos caracteres de a
std::string
com iteradores:Fazendo um loop pelos caracteres de a
std::string
com um loop for antiquado:Loop através dos caracteres de uma matriz de caracteres terminados em nulo:
fonte
std::string
, que é apenas uma série de bytes.Um loop for pode ser implementado assim:
Isso imprimirá a sequência de caracteres por caractere.
str[i]
retorna caractere no índicei
.Se for uma matriz de caracteres:
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
No C ++ moderno:
No C ++ 98/03:
Para iteração somente leitura, você pode usar
std::string::const_iterator
no C ++ 98 efor (char const & c : s)
ou apenasfor (char c : s)
no C ++ 11.fonte
auto
é sempre uma boa ideia. Ao usá-lo, a distinção entrebegin()
ecbegin()
se torna relevante.char & c
)? É apenas para permitir a modificação do valor do caractere, caso seja necessário?Aqui está outra maneira de fazer isso, usando o algoritmo padrão.
fonte
fonte
strlen
na 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.strlen
na 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 .Não vejo nenhum exemplo usando um intervalo baseado em loop com uma "string c".
exemplo não relacionado, mas int array
fonte
Para C-string (
char []
), você deve fazer algo assim:Pois
std::string
você pode usarstr.size()
para obter seu tamanho e iterar como no exemplo, ou pode usar um iterador:fonte
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.
fonte
você pode obter todos os caracteres de uma string usando a função at da biblioteca de strings, como eu fiz dessa maneira
este é apenas um segmento do meu código, mas o ponto é que você pode acessar caracteres
stringname.at(index)
fonte