2013-02-03 18 views
10

Próbuję iterować ciąg znaków char. Próbowałem coś takiego:Powtórz ciąg znaków char według char

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

Tak więc ta funkcja wywołania print ("hello"); Należy zwrócić:

h 
e 
l 
l 
o 

próbuję za pomocą mojego kodu, ale to nie działa w ogóle. btw parametr jest odwołaniem, a nie wskaźnikiem. Dziękujemy

+0

Parametr może być punktem odniesienia, tak, ale tak jest 'exp' . Nawiasem mówiąc, 'std :: string' przeładował' operator [] ', i ma funkcje' begin() 'oraz' end() ', a także pracuje z darmową wersją wspomnianej pary funkcji do iteracji. – chris

+0

możliwy duplikat [Jak mogę wykonać iterację przez ciąg znaków i znać indeks (aktualna pozycja)?] (Http://stackoverflow.com/questions/1315041/how-can-i-teriter-through-a-string- i-także-wiem-the-index-current-position) – jww

+0

możliwy duplikat [Dla każdej litery w ciągu] (http://stackoverflow.com/questions/9438209/for-every-character-in-string) – Csq

Odpowiedz

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

Tak to zrobiłem. Nie jestem pewien, czy to zbyt "idiomatyczne".

+0

@ user1988385, Do drukowania działa nawet 'std :: cout << infix;'. – chris

0

std::string::c_str() powraca const char*, nie można używać char& trzymać go. Exp jest również wskaźnik już nie trzeba odniesienie:

Lepsze wykorzystanie iterator jednak:

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

naprawić swój oryginalny kod, spróbuj:

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

Czy istnieje jakikolwiek powód, dla którego chcielibyśmy użyć znaku * nad pętlą for (w mojej odpowiedzi)? Nigdy nie byłem pewien, czy tak robili inni ludzie. –

+0

@DhaivatPandya, Nie bardzo, nie. Iterowanie 'std :: string' przy użyciu' const char * 'wydaje mi się bezsensowną próbą. – chris

+0

Używałbym iteratora zamiast działającego na surowym wskaźniku ... – billz

5

Jeśli używasz std::string naprawdę nie ma powodu, aby to robić. Można użyć iteratorów:

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

Co do oryginalnego kodu należy zostały z wykorzystaniem char* zamiast char i nie trzeba odniesienia.

+0

Ale może on nie tylko chce go skopiować? Po prostu zapytano go, jak należy powtarzać ciąg znaków po znaku. –

+0

W zależności od tego, co robisz, prawdopodobnie istnieje coś, co zastąpi wywołanie 'copy', które działa prawie tak samo. – chris

+0

Zabawną rzeczą w wynikach jest to, że możesz i powinieneś po prostu 'std :: cout << infix;'. Jednak, aby zrobić cokolwiek innego, działa algorytm lub pętla iteratora. Również, jeśli już używałem 'auto', użyłbym pętli for opartej na zasięgach również w pętli iteratora: p – chris

16

Kod potrzebuje, a nie wskaźnik odniesienia, ale w przypadku korzystania z kompilatora C++ 11, wszystko czego potrzebujesz to:

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