2013-02-03 17 views
10

Cerco di ripetere su una stringa char per char. Ho provato qualcosa del genere:Iterate tramite stringa char per char

void print(const string& infix) 
{ 
char &exp = infix.c_str(); 
while(&exp!='\0') 
{ 
     cout<< &exp++ << endl; 
    } 
} 

Quindi questa funzione chiama print ("ciao"); dovrebbe restituire:

h 
e 
l 
l 
o 

Provo a utilizzare il mio codice, ma non funziona affatto. btw il parametro è un riferimento non un puntatore. Grazie

+0

Il parametro potrebbe essere un punto di riferimento, sì, ma così è 'exp' . A proposito, 'std :: string' ha sovraccaricato' operator [] ', e ha funzioni' begin() 'e' end() ', oltre a lavorare con la versione gratuita di detta coppia di funzioni per iterare. – chris

+0

possibile duplicato di [Come posso ripetere una stringa e conoscere anche l'indice (posizione corrente)?] (Http://stackoverflow.com/questions/1315041/how-can-i-iterate-through-a-string- e-anche-conoscere-l'-indice-posizione-corrente) – jww

+0

possibile duplicato di [Per ogni carattere nella stringa] (http://stackoverflow.com/questions/9438209/for-every-character-in-string) – Csq

risposta

10
for(unsigned int i = 0; i<infix.length(); i++) { 
    char c = infix[i]; //this is your character 
} 

Ecco come l'ho fatto. Non sono sicuro che sia troppo "idiomatico".

+0

@ user1988385, Per la stampa, anche 'std :: cout << infix;' funziona. – chris

0

std::string::c_str() restituisce const char*, non è possibile utilizzare char& per tenerlo. Anche exp è puntatore già, non c'è bisogno di riferimento:

Migliore utilizzo iteratore però:

void print(const string& infix) 
{ 
    for (auto c = infix.begin(); c!=infix.end(); ++c) 
    { 
    std::cout << *c << "\n"; 
    } 
    std::cout << std::endl; 
} 

Per risolvere il tuo codice originale, provare:

void print(const string& infix) 
{ 
    const char *exp = infix.c_str(); 
    while(*exp!='\0') 
    { 
    cout << *exp << endl; 
    exp++; 
    } 
} 
+0

C'è qualche ragione per usare char * solo su un ciclo for (nella mia risposta)? Non sono mai stato sicuro se è così che hanno fatto gli altri. –

+0

@DhaivatPandya, Non proprio, no. L'iterazione di una 'std :: string' usando un' const char * 'sembra uno sforzo inutile per me. – chris

+0

Vorrei usare iteratore invece di operare su puntatore raw .... – billz

5

Se stai usando std::string , non c'è davvero una ragione per farlo. È possibile utilizzare gli iteratori:

for (auto i = inflix.begin(); i != inflix.end(); ++i) std::cout << *i << '\n'; 

Per quanto riguarda il codice originale si dovrebbe avete usato char* invece di char e non hai bisogno del riferimento.

+0

Ma forse non vuole solo copiarlo? Gli viene semplicemente chiesto come ripetere la stringa carattere per carattere. –

+0

A seconda di cosa si sta facendo, probabilmente c'è qualcosa per sostituire la chiamata 'copia', che però funziona quasi allo stesso modo. – chris

+0

La cosa divertente dell'output è che puoi e dovresti semplicemente 'std :: cout << infix;'. Tuttavia, dovendo fare qualsiasi altra cosa, funziona un algoritmo o un loop iteratore. Inoltre, se si utilizza già 'auto', utilizzerei un loop per loop su un loop iteratore: p – chris

16

Il codice ha bisogno di un puntatore, non un riferimento, ma se si utilizza un compilatore C++ 11, tutto ciò che serve è:

void print(const std::string& infix) 
{ 
    for(auto c : infix) 
     std::cout << c << std::endl; 
}