Untuk setiap karakter dalam string

229

Bagaimana saya melakukan loop for pada setiap karakter dalam string di C ++?

Jack Wilsdon
sumber
9
String apa? C-string, atau std::string?
Mysticial
Itu dibaca dari file teks, jadi saya mengasumsikan std ::
Jack Wilsdon
4
Karakter seperti apa? char, Titik kode Unicode, cluster grapheme yang diperluas?
Philipp
Kemungkinan duplikat dari Bagaimana saya bisa mengulang melalui string dan juga tahu indeks (posisi saat ini)? . Jangan khawatir tentang indexbagian dalam jawaban.
jww

Jawaban:

417
  1. 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);
    }
  2. 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);
    }
  3. 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]);
    }
  4. Looping melalui karakter-karakter dari array karakter null-dihentikan:

    char* str = ???;
    for(char* it = str; *it; ++it) {
        do_things_with(*it);
    }
R. Martinho Fernandes
sumber
4
@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 atas std::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.


sumber
24

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_iteratordi C ++ 98, dan for (char const & c : s)atau hanya for (char c : s)di C ++ 11.

Kerrek SB
sumber
Berikut adalah beberapa opsi untuk kompiler dengan dukungan C ++ 11 parsial: pastebin.com/LBULsn76
Benjamin Lindley
@BenjaminLindley: Terima kasih! autoselalu merupakan ide bagus. Saat menggunakannya, perbedaan antara begin()dan cbegin()menjadi relevan.
Kerrek SB
2
apa peran referensi di char di sini ( char & c)? Apakah hanya untuk memungkinkan modifikasi nilai karakter dalam kasus yang diperlukan?
LunaticSoul
11

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;
   });
}
0xBADF00
sumber
Kami memiliki tahun 2018 jadi ini harus menjadi jawaban yang benar.
pertama
7
const char* str = "abcde";
int len = strlen(str);
for (int i = 0; i < len; i++)
{
    char chr = str[i];
    //do something....
}
demoncodemonkey
sumber
4
(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 .
Magnus Hoff
@MagnusHoff: Yup, Schlemiel sang Pelukis menyandang kepalanya yang jelek lagi.
Fred Larson
Saya sudah mengedit jawaban saya. Magnus kau benar, oops telah menggunakan foreach di c # selama beberapa tahun terakhir;)
demoncodemonkey
Namun Anda harus tetap menggunakan strlen () di luar loop dalam preferensi untuk menguji null di setiap iterasi.
mckenzm
4

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);
}
10SecTom
sumber
1

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::stringAnda 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;
}
Tiago Pasqualini
sumber
1
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.

hampir seorang pemula
sumber
-1

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)

Shuja Ul Hasan
sumber