Bagaimana saya melakukan loop for pada setiap karakter dalam string di C ++?
char
, Titik kode Unicode, cluster grapheme yang diperluas?
index
bagian dalam jawaban.
Bagaimana saya melakukan loop for pada setiap karakter dalam string di C ++?
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):
std::string str = ???;
for(char& c : str) {
do_things_with(c);
}
Looping melalui karakter a std::string
dengan iterators:
std::string str = ???;
for(std::string::iterator it = str.begin(); it != str.end(); ++it) {
do_things_with(*it);
}
Mengitari karakter a std::string
dengan 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);
}
std::string
, yang hanya serangkaian byte.
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.
Dalam C ++ modern:
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_iterator
di C ++ 98, dan for (char const & c : s)
atau hanya for (char c : s)
di C ++ 11.
auto
selalu merupakan ide bagus. Saat menggunakannya, perbedaan antara begin()
dan cbegin()
menjadi relevan.
char & c
)? Apakah hanya untuk memungkinkan modifikasi nilai karakter dalam kasus yang diperlukan?
Berikut ini cara lain untuk melakukannya, menggunakan algoritma standar.
#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
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".
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);
}
tidak terkait tetapi contoh array int
int ia[] = {1,2,3,4,5,6};
for (int& i : ia) {
printf("%d", i);
}
Untuk C-string ( char []
) Anda harus melakukan sesuatu seperti ini:
char mystring[] = "My String";
int size = strlen(mystring);
int i;
for(i = 0; i < size; i++) {
char c = mystring[i];
}
Untuk std::string
Anda dapat menggunakan str.size()
untuk mendapatkan ukurannya dan beralih seperti contoh, atau bisa menggunakan iterator:
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
}
//...........
}
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.
Anda bisa mendapatkan setiap char dalam sebuah string dengan menggunakan fungsi pada library string, seperti yang saya lakukan seperti ini
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;
}
ini hanya bagian dari kode saya tetapi intinya adalah Anda dapat mengakses karakter dengan stringname.at(index)
std::string
?