Recorriendo los caracteres de a std::string, utilizando un bucle for basado en rango (es de C ++ 11, ya admitido en versiones recientes de GCC, clang y VC11 beta):
std::string str =???;for(char& c : str){
do_things_with(c);}
Recorriendo los caracteres de a std::stringcon iteradores:
std::string str =???;for(std::string::iterator it = str.begin(); it != str.end();++it){
do_things_with(*it);}
Recorriendo los personajes de a std::stringcon un bucle for antiguo:
std::string str =???;for(std::string::size_type i =0; i < str.size();++i){
do_things_with(str[i]);}
Recorriendo los caracteres de una matriz de caracteres con terminación nula:
char* str =???;for(char* it = str;*it;++it){
do_things_with(*it);}
@ Robinson: Esa es una suposición errónea. Una suposición muy defectuosa. Además, "personaje" tiene tantos significados diferentes, que es mejor evitar estrictamente el término.
Puppy
66
@Robinson: "std :: string es UTF8 (se supone que es) " ¿Desde cuándo?
ligereza corre en órbita el
2
Bueno, está bien, no tiene codificación, sin embargo, dada la ubicuidad de utf8 ahora (especialmente en la web) y el hecho de que uno podría desear una sola codificación consistente a través de una tubería o aplicación, para la base de esta discusión, mis cadenas std :: son todos utf8: p.
Robinson
44
@Robinson: Y todos los míos son tratados como sin codificación porque no estoy programando en un dominio orientado al usuario (es decir, no hay cadenas destinadas a ser prestados a humanos). Si desea hablar sobre codificaciones de caracteres, debe hablar sobre una abstracción de nivel superiorstd::string , que es solo una serie de bytes.
ligereza corre en órbita el
1
Además, los casos 2 y 3 son un buen ejemplo de dónde puede / debe usar "auto"
galois
29
Un bucle for puede implementarse así:
string str("HELLO");for(int i =0; i < str.size(); i++){
cout << str[i];}
Esto imprimirá la cadena carácter por carácter. str[i]Devuelve el carácter en el índice i.
Si es una matriz de caracteres:
char str[6]="hello";for(int i =0; str[i]!='\0'; i++){
cout << str[i];}
Básicamente, arriba de dos hay dos tipos de cadenas compatibles con c ++. El segundo se llama cadena c y el primero se llama cadena estándar o (cadena c ++). Sugeriría usar una cadena c ++, mucho más fácil de manejar.
Aquí hay un par de opciones para compiladores con soporte parcial de C ++ 11: pastebin.com/LBULsn76
Benjamin Lindley
@BenjaminLindley: ¡Gracias! autoSiempre es una buena idea. Al usarlo, la distinción entre begin()y se cbegin()vuelve relevante.
Kerrek SB
2
¿Cuál es el papel de la referencia en char here ( char & c)? ¿Es solo para permitir la modificación del valor del personaje en caso de que sea necesario?
LunaticSoul
11
Aquí hay otra forma de hacerlo, utilizando el algoritmo estándar.
(Comentario desactualizado, que probablemente todavía sea relevante para el OP :) No se considera una buena forma de usar strlenen la condición del bucle, ya que requiere una operación O (n) en la cadena para cada iteración, haciendo que todo el bucle O (n ^ 2) en el tamaño de la cadena. strlenen la condición de bucle se puede llamar si la cadena cambia durante el bucle, pero se debe reservar para los casos en que realmente se requiere .
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 cadena es básicamente una matriz de caracteres, por lo tanto, puede especificar el índice para obtener el carácter. Si no conoce el índice, puede recorrerlo como el código anterior, pero cuando haga una comparación, asegúrese de usar comillas simples (que especifican un carácter).
Aparte de eso, el código anterior se explica por sí mismo.
puedes obtener todos los caracteres en una cadena usando la función at de la biblioteca de cadenas, como lo hice así
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;}
esto es solo un segmento de mi código, pero el punto es que puedes acceder a los caracteres por stringname.at(index)
std::string
?char
, Punto de código Unicode, clúster de grafema extendido?index
parte en las respuestas.Respuestas:
Recorriendo los caracteres de a
std::string
, utilizando un bucle for basado en rango (es de C ++ 11, ya admitido en versiones recientes de GCC, clang y VC11 beta):Recorriendo los caracteres de a
std::string
con iteradores:Recorriendo los personajes de a
std::string
con un bucle for antiguo:Recorriendo los caracteres de una matriz de caracteres con terminación nula:
fuente
std::string
, que es solo una serie de bytes.Un bucle for puede implementarse así:
Esto imprimirá la cadena carácter por carácter.
str[i]
Devuelve el carácter en el índicei
.Si es una matriz de caracteres:
Básicamente, arriba de dos hay dos tipos de cadenas compatibles con c ++. El segundo se llama cadena c y el primero se llama cadena estándar o (cadena c ++). Sugeriría usar una cadena c ++, mucho más fácil de manejar.
fuente
En C ++ moderno:
En C ++ 98/03:
Para la iteración de solo lectura, puede usarla
std::string::const_iterator
en C ++ 98 y /for (char const & c : s)
o solofor (char c : s)
en C ++ 11.fuente
auto
Siempre es una buena idea. Al usarlo, la distinción entrebegin()
y secbegin()
vuelve relevante.char & c
)? ¿Es solo para permitir la modificación del valor del personaje en caso de que sea necesario?Aquí hay otra forma de hacerlo, utilizando el algoritmo estándar.
fuente
fuente
strlen
en la condición del bucle, ya que requiere una operación O (n) en la cadena para cada iteración, haciendo que todo el bucle O (n ^ 2) en el tamaño de la cadena.strlen
en la condición de bucle se puede llamar si la cadena cambia durante el bucle, pero se debe reservar para los casos en que realmente se requiere .No veo ningún ejemplo que use un rango basado en el bucle con una "cadena c".
no relacionado pero ejemplo de matriz int
fuente
Para C-string (
char []
) deberías hacer algo como esto:Para
std::string
usted puede utilizarstr.size()
para conseguir su tamaño y iterate como el ejemplo, o podría utilizar un iterador:fuente
Una cadena es básicamente una matriz de caracteres, por lo tanto, puede especificar el índice para obtener el carácter. Si no conoce el índice, puede recorrerlo como el código anterior, pero cuando haga una comparación, asegúrese de usar comillas simples (que especifican un carácter).
Aparte de eso, el código anterior se explica por sí mismo.
fuente
puedes obtener todos los caracteres en una cadena usando la función at de la biblioteca de cadenas, como lo hice así
esto es solo un segmento de mi código, pero el punto es que puedes acceder a los caracteres por
stringname.at(index)
fuente