Come farei un ciclo for su ogni carattere nella stringa in C ++?
char
, Punto di codice Unicode, cluster grapheme esteso?
index
parte nelle risposte.
Come farei un ciclo for su ogni carattere nella stringa in C ++?
char
, Punto di codice Unicode, cluster grapheme esteso?
index
parte nelle risposte.
Risposte:
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);
}
Scorrendo i personaggi di a std::string
con iteratori:
std::string str = ???;
for(std::string::iterator it = str.begin(); it != str.end(); ++it) {
do_things_with(*it);
}
Ripercorrendo i personaggi di a std::string
con un for-loop vecchio stile:
std::string str = ???;
for(std::string::size_type i = 0; i < str.size(); ++i) {
do_things_with(str[i]);
}
Scorrendo i caratteri di una matrice di caratteri con terminazione null:
char* str = ???;
for(char* it = str; *it; ++it) {
do_things_with(*it);
}
std::string
, che è solo una serie di byte.
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.
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_iterator
in C ++ 98 e for (char const & c : s)
o semplicemente for (char c : s)
in C ++ 11.
auto
è sempre una buona idea. Quando lo si utilizza, la distinzione tra begin()
e cbegin()
diventa rilevante.
char & c
)? È solo per consentire la modifica del valore del carattere nel caso sia necessario?
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;
});
}
const char* str = "abcde";
int len = strlen(str);
for (int i = 0; i < len; i++)
{
char chr = str[i];
//do something....
}
strlen
nella 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. strlen
nella condizione del ciclo può essere richiesto se la stringa cambia durante il ciclo, ma dovrebbe essere riservata ai casi in cui è effettivamente richiesta .
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);
}
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::string
puoi 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;
}
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.
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)
std::string
?