Pętlowanie znaków a std::string, przy użyciu pętli opartej na zakresie (pochodzi z C ++ 11, obsługiwanej już w najnowszych wersjach GCC, clang i VC11 beta):
std::string str =???;for(char& c : str){
do_things_with(c);}
Pętla po znakach std::stringiteratorów:
std::string str =???;for(std::string::iterator it = str.begin(); it != str.end();++it){
do_things_with(*it);}
Pętlowanie przez postacie std::stringze staroświecką pętlą for:
std::string str =???;for(std::string::size_type i =0; i < str.size();++i){
do_things_with(str[i]);}
Pętla przez znaki tablicy znaków zakończonej znakiem null:
char* str =???;for(char* it = str;*it;++it){
do_things_with(*it);}
@Robinson: To błędne założenie. Bardzo błędne założenie. Ponadto „charakter” ma tak wiele różnych znaczeń, że najlepiej jest unikać tego terminu.
Szczeniak
6
@Robinson: „std :: string to UTF8 (zakłada się, że jest) ” Od kiedy ?!
Wyścigi lekkości na orbicie
2
No cóż, OK, nie ma kodowania, jednak biorąc pod uwagę wszechobecność utf8 teraz (szczególnie w Internecie) i fakt, że można chcieć jednego spójnego kodowania w potoku lub aplikacji, na podstawie tej dyskusji moje std :: strings są wszystkie utf8: p.
Robinson
4
@Robinson: I wszystkie moje są traktowane jako bez kodowania, ponieważ nie programuję w domenie, w której znajdują się użytkownicy (tzn. Nie ma ciągów przeznaczonych do renderowania dla ludzi). Jeśli chcesz porozmawiać o kodowania znaków, trzeba mówić o wyższym poziomie abstrakcji na górzestd::string , która jest po prostu seria bajtów.
Wyścigi lekkości na orbicie
1
również przypadki 2 i 3 są dobrym przykładem tego, gdzie można / należy użyć „auto”
galois
29
Pętlę for można zaimplementować w następujący sposób:
string str("HELLO");for(int i =0; i < str.size(); i++){
cout << str[i];}
Spowoduje to wydrukowanie łańcucha znak po znaku. str[i]zwraca znak przy indeksie i.
Jeśli jest to tablica znaków:
char str[6]="hello";for(int i =0; str[i]!='\0'; i++){
cout << str[i];}
Zasadniczo powyżej dwóch są dwa typy ciągów obsługiwanych przez c ++. Drugi nazywa się ciągiem c, a pierwszy ciągiem std lub (ciągiem c ++). Sugerowałbym użycie ciągu c ++, co jest łatwe w obsłudze.
(Nieaktualny komentarz, który prawdopodobnie jest nadal istotny dla OP :) Nie uważa się za dobrą formę do użycia strlenw warunku pętli, ponieważ wymaga ona operacji O (n) na łańcuchu dla każdej iteracji, co powoduje, że cała pętla O (n ^ 2) w rozmiarze ciągu. strlenw pętli można wywołać warunek, jeśli łańcuch zmienia się podczas pętli, ale powinien być zarezerwowany dla przypadków, w których jest to faktycznie wymagane .
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}//...........}
Łańcuch jest w zasadzie tablicą znaków, dlatego możesz określić indeks, aby uzyskać znak. Jeśli nie znasz indeksu, możesz go przeglądać jak w powyższym kodzie, ale robiąc porównanie, upewnij się, że używasz pojedynczych cudzysłowów (które określają znak).
możesz pobrać każdy znak w ciągu używając funkcji at biblioteki ciągów, tak jak ja to zrobiłem
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;}
to tylko fragment mojego kodu, ale chodzi o to, że możesz uzyskać dostęp do znaków przez stringname.at(index)
std::string
?char
, Punkt kodowy Unicode, rozszerzony klaster grafemowy?index
część w odpowiedziach.Odpowiedzi:
Pętlowanie znaków a
std::string
, przy użyciu pętli opartej na zakresie (pochodzi z C ++ 11, obsługiwanej już w najnowszych wersjach GCC, clang i VC11 beta):Pętla po znakach
std::string
iteratorów:Pętlowanie przez postacie
std::string
ze staroświecką pętlą for:Pętla przez znaki tablicy znaków zakończonej znakiem null:
źródło
std::string
, która jest po prostu seria bajtów.Pętlę for można zaimplementować w następujący sposób:
Spowoduje to wydrukowanie łańcucha znak po znaku.
str[i]
zwraca znak przy indeksiei
.Jeśli jest to tablica znaków:
Zasadniczo powyżej dwóch są dwa typy ciągów obsługiwanych przez c ++. Drugi nazywa się ciągiem c, a pierwszy ciągiem std lub (ciągiem c ++). Sugerowałbym użycie ciągu c ++, co jest łatwe w obsłudze.
źródło
We współczesnym C ++:
W C ++ 98/03:
W przypadku iteracji tylko do odczytu można użyć
std::string::const_iterator
w C ++ 98for (char const & c : s)
lub tylkofor (char c : s)
w C ++ 11.źródło
auto
jest zawsze dobrym pomysłem. Podczas korzystania z niego rozróżnienie międzybegin()
icbegin()
staje się istotne.char & c
)? Czy to po prostu pozwala na modyfikację wartości postaci w przypadku, gdy jest to potrzebne?Oto inny sposób na zrobienie tego przy użyciu standardowego algorytmu.
źródło
źródło
strlen
w warunku pętli, ponieważ wymaga ona operacji O (n) na łańcuchu dla każdej iteracji, co powoduje, że cała pętla O (n ^ 2) w rozmiarze ciągu.strlen
w pętli można wywołać warunek, jeśli łańcuch zmienia się podczas pętli, ale powinien być zarezerwowany dla przypadków, w których jest to faktycznie wymagane .Nie widzę żadnych przykładów używania zakresu opartego na pętli z „ciągiem c”.
nie spokrewnione, ale int przykład tablicy
źródło
W przypadku C-string (
char []
) powinieneś zrobić coś takiego:Dla
std::string
można użyćstr.size()
, aby uzyskać jego rozmiar i powtórzyć, jak na przykład, czy można użyć iterator:źródło
Łańcuch jest w zasadzie tablicą znaków, dlatego możesz określić indeks, aby uzyskać znak. Jeśli nie znasz indeksu, możesz go przeglądać jak w powyższym kodzie, ale robiąc porównanie, upewnij się, że używasz pojedynczych cudzysłowów (które określają znak).
Poza tym powyższy kod jest oczywisty.
źródło
możesz pobrać każdy znak w ciągu używając funkcji at biblioteki ciągów, tak jak ja to zrobiłem
to tylko fragment mojego kodu, ale chodzi o to, że możesz uzyskać dostęp do znaków przez
stringname.at(index)
źródło