Melingkupi karakter a std::string, menggunakan rentang berbasis untuk loop (ini dari C ++ 11, sudah didukung dalam rilis terbaru GCC, dentang, dan VC11 beta):
std::string str =???;for(char& c : str){
do_things_with(c);}
Looping melalui karakter a std::stringdengan iterators:
std::string str =???;for(std::string::iterator it = str.begin(); it != str.end();++it){
do_things_with(*it);}
Mengitari karakter a std::stringdengan for-loop kuno:
std::string str =???;for(std::string::size_type i =0; i < str.size();++i){
do_things_with(str[i]);}
Looping melalui karakter-karakter dari array karakter null-dihentikan:
char* str =???;for(char* it = str;*it;++it){
do_things_with(*it);}
@Robinson: Itu anggapan yang salah. Asumsi yang sangat salah. Juga, "karakter" memiliki banyak arti yang berbeda, yang terbaik adalah menghindari istilah itu.
Puppy
6
@Robinson: "std :: string adalah UTF8 (diasumsikan) " Sejak kapan ?!
Lightness Races di Orbit
2
Baiklah, tidak ada encoding, tetapi mengingat keberadaan utf8 sekarang (terutama di web) dan fakta bahwa seseorang mungkin menginginkan satu pengkodean yang konsisten di sepanjang pipa atau aplikasi, untuk dasar diskusi ini std :: string saya semuanya utf8: hlm.
Robinson
4
@Robinson: Dan semua milik saya diperlakukan sebagai penyandian-kurang karena saya tidak pemrograman dalam domain yang menghadap pengguna (yaitu, tidak ada string yang ditakdirkan untuk diberikan kepada manusia). Jika Anda ingin berbicara tentang pengkodean karakter, Anda perlu berbicara tentang abstraksi tingkat yang lebih tinggi di atasstd::string , yang hanya serangkaian byte.
Lightness Races in Orbit
1
juga, kasus 2 dan 3 adalah contoh yang baik di mana Anda dapat / harus menggunakan "otomatis"
galois
29
A for loop dapat diimplementasikan seperti ini:
string str("HELLO");for(int i =0; i < str.size(); i++){
cout << str[i];}
Ini akan mencetak karakter string dengan karakter. str[i]mengembalikan karakter pada indeks i.
Jika array karakter:
char str[6]="hello";for(int i =0; str[i]!='\0'; i++){
cout << str[i];}
Pada dasarnya dua di atas adalah dua jenis string yang didukung oleh c ++. Yang kedua disebut c string dan yang pertama disebut std string atau (c ++ string) .Saya sarankan menggunakan c ++ string, banyak Mudah untuk menangani.
std::string s("Hello world");for(char& c : s){
std::cout <<"One character: "<< c <<"\n";
c ='*';}
Dalam C ++ 98/03:
for(std::string::iterator it = s.begin(), end = s.end(); it != end;++it){
std::cout <<"One character: "<<*it <<"\n";*it ='*';}
Untuk iterasi baca-saja, Anda bisa menggunakan std::string::const_iteratordi C ++ 98, dan for (char const & c : s)atau hanya for (char c : s)di C ++ 11.
(Komentar yang sudah kadaluarsa, yang mungkin masih relevan untuk OP :) Ini bukan bentuk yang baik untuk digunakan strlendalam kondisi loop, karena membutuhkan operasi O (n) pada string untuk setiap iterasi, membuat seluruh loop O (n ^ 2) dalam ukuran string. strlendalam kondisi loop dapat dipanggil untuk jika string berubah selama loop, tetapi harus disediakan untuk kasus-kasus di mana sebenarnya diperlukan .
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}//...........}
String pada dasarnya adalah array karakter, oleh karena itu Anda dapat menentukan indeks untuk mendapatkan karakter. Jika Anda tidak tahu indeksnya, maka Anda dapat mengulanginya seperti kode di atas, tetapi ketika Anda membuat perbandingan, pastikan Anda menggunakan tanda kutip tunggal (yang menentukan karakter).
Anda bisa mendapatkan setiap char dalam sebuah string dengan menggunakan fungsi pada library string, seperti yang saya lakukan seperti ini
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;}
ini hanya bagian dari kode saya tetapi intinya adalah Anda dapat mengakses karakter dengan stringname.at(index)
std::string
?char
, Titik kode Unicode, cluster grapheme yang diperluas?index
bagian dalam jawaban.Jawaban:
Melingkupi karakter a
std::string
, menggunakan rentang berbasis untuk loop (ini dari C ++ 11, sudah didukung dalam rilis terbaru GCC, dentang, dan VC11 beta):Looping melalui karakter a
std::string
dengan iterators:Mengitari karakter a
std::string
dengan for-loop kuno:Looping melalui karakter-karakter dari array karakter null-dihentikan:
sumber
std::string
, yang hanya serangkaian byte.A for loop dapat diimplementasikan seperti ini:
Ini akan mencetak karakter string dengan karakter.
str[i]
mengembalikan karakter pada indeksi
.Jika array karakter:
Pada dasarnya dua di atas adalah dua jenis string yang didukung oleh c ++. Yang kedua disebut c string dan yang pertama disebut std string atau (c ++ string) .Saya sarankan menggunakan c ++ string, banyak Mudah untuk menangani.
sumber
Dalam C ++ modern:
Dalam C ++ 98/03:
Untuk iterasi baca-saja, Anda bisa menggunakan
std::string::const_iterator
di C ++ 98, danfor (char const & c : s)
atau hanyafor (char c : s)
di C ++ 11.sumber
auto
selalu merupakan ide bagus. Saat menggunakannya, perbedaan antarabegin()
dancbegin()
menjadi relevan.char & c
)? Apakah hanya untuk memungkinkan modifikasi nilai karakter dalam kasus yang diperlukan?Berikut ini cara lain untuk melakukannya, menggunakan algoritma standar.
sumber
sumber
strlen
dalam kondisi loop, karena membutuhkan operasi O (n) pada string untuk setiap iterasi, membuat seluruh loop O (n ^ 2) dalam ukuran string.strlen
dalam kondisi loop dapat dipanggil untuk jika string berubah selama loop, tetapi harus disediakan untuk kasus-kasus di mana sebenarnya diperlukan .Saya tidak melihat contoh menggunakan rentang berbasis untuk loop dengan "c string".
tidak terkait tetapi contoh array int
sumber
Untuk C-string (
char []
) Anda harus melakukan sesuatu seperti ini:Untuk
std::string
Anda dapat menggunakanstr.size()
untuk mendapatkan ukurannya dan beralih seperti contoh, atau bisa menggunakan iterator:sumber
String pada dasarnya adalah array karakter, oleh karena itu Anda dapat menentukan indeks untuk mendapatkan karakter. Jika Anda tidak tahu indeksnya, maka Anda dapat mengulanginya seperti kode di atas, tetapi ketika Anda membuat perbandingan, pastikan Anda menggunakan tanda kutip tunggal (yang menentukan karakter).
Selain itu, kode di atas cukup jelas.
sumber
Anda bisa mendapatkan setiap char dalam sebuah string dengan menggunakan fungsi pada library string, seperti yang saya lakukan seperti ini
ini hanya bagian dari kode saya tetapi intinya adalah Anda dapat mengakses karakter dengan
stringname.at(index)
sumber