Untuk setiap karakter dalam string


229

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


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);
    }

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.


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.


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;
   });
}

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....
}

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);
}

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;
}

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.


-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)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.