¿Cómo haría un bucle for en cada carácter de la cadena en C ++?
char
, Punto de código Unicode, clúster de grafema extendido?
index
parte en las respuestas.
¿Cómo haría un bucle for en cada carácter de la cadena en C ++?
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):
std::string str = ???;
for(char& c : str) {
do_things_with(c);
}
Recorriendo los caracteres de a std::string
con 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::string
con 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);
}
std::string
, que es solo una serie de bytes.
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.
En C ++ moderno:
std::string s("Hello world");
for (char & c : s)
{
std::cout << "One character: " << c << "\n";
c = '*';
}
En C ++ 98/03:
for (std::string::iterator it = s.begin(), end = s.end(); it != end; ++it)
{
std::cout << "One character: " << *it << "\n";
*it = '*';
}
Para la iteración de solo lectura, puede usarla std::string::const_iterator
en C ++ 98 y / for (char const & c : s)
o solo for (char c : s)
en C ++ 11.
auto
Siempre es una buena idea. Al usarlo, la distinción entre begin()
y se cbegin()
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.
#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;
});
}
const char* str = "abcde";
int len = strlen(str);
for (int i = 0; i < len; i++)
{
char chr = str[i];
//do something....
}
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".
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);
}
no relacionado pero ejemplo de matriz int
int ia[] = {1,2,3,4,5,6};
for (int& i : ia) {
printf("%d", i);
}
Para C-string ( char []
) deberías hacer algo como esto:
char mystring[] = "My String";
int size = strlen(mystring);
int i;
for(i = 0; i < size; i++) {
char c = mystring[i];
}
Para std::string
usted puede utilizar str.size()
para conseguir su tamaño y iterate como el ejemplo, o podría utilizar un iterador:
std::string mystring = "My String";
std::string::iterator it;
for(it = mystring.begin(); it != mystring.end(); it++) {
char c = *it;
}
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 (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;
}
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
?