Apa cara efektif untuk mengganti semua kemunculan karakter dengan karakter lain std::string
?
c++
algorithm
str-replace
stdstring
besar-z
sumber
sumber
std::string
adalah wadah yang dirancang khusus untuk beroperasi dengan urutan karakter. tautanstd::string::replace()
alih - alihstd::replace()
! 'x' (char
) secara tidak langsung dilemparkan kesize_t
[nilai 120], sehingga seluruh string atau atau bagian dari itu akan diisi dengan 120 salinan 'y'.Saya pikir saya juga akan melemparkan solusi penambah:
sumber
-I
flag untuk kompiler Anda agar bisa menemukan pustaka Boost di sistem Anda. Mungkin Anda harus menginstalnya terlebih dahulu.Pertanyaannya berpusat pada
character
penggantian, tetapi, karena saya menemukan halaman ini sangat berguna (terutama komentar Konrad ), saya ingin berbagi implementasi yang lebih umum ini, yang memungkinkan untuk menanganisubstrings
juga:Pemakaian:
Output:
EDIT:
Hal di atas dapat diimplementasikan dengan cara yang lebih cocok, jika pertunjukan menjadi perhatian Anda, dengan tidak mengembalikan apa pun (
void
) dan melakukan perubahan secara langsung pada string yangstr
diberikan sebagai argumen, diteruskan dengan alamat alih-alih berdasarkan nilai . Ini akan menghindari salinan string asli yang tidak berguna dan mahal, sambil mengembalikan hasilnya. Teleponmu, lalu ...Kode:
Semoga ini akan bermanfaat bagi beberapa orang lain ...
sumber
from
string kosong, jika tidak, loop tanpa akhir akan terjadi.Bayangkan gumpalan biner besar di mana semua 0x00 byte akan diganti oleh "\ 1 \ x30" dan semua 0x01 byte oleh "\ 1 \ x31" karena protokol transport tidak mengizinkan \ 0-byte.
Dalam kasus di mana:
solusi yang disediakan tidak dapat diterapkan (karena mereka hanya mengganti karakter tunggal) atau memiliki masalah kinerja, karena mereka akan memanggil string :: ganti beberapa kali yang menghasilkan salinan ukuran gumpalan berulang-ulang. (Saya tidak tahu solusi peningkatannya, mungkin tidak apa-apa dari perspektif itu)
Yang ini berjalan di sepanjang semua kemunculan dalam string sumber dan membuat string baru sepotong demi sepotong sekali :
sumber
Pencarian dan penggantian sederhana untuk satu karakter akan menghasilkan sesuatu seperti:
s.replace(s.find("x"), 1, "y")
Untuk melakukan ini pada seluruh string, hal yang mudah dilakukan adalah mengulang sampai Anda
s.find
mulai kembalinpos
. Saya kira Anda juga bisa menangkaprange_error
untuk keluar dari loop, tapi itu agak jelek.sumber
{
karakternya. Saya tidak tahu apa itu "penjepit ganda". Mungkin Anda memiliki masalah font?Jika Anda ingin mengganti lebih dari satu karakter, dan hanya berurusan dengan
std::string
, maka cuplikan ini akan berfungsi, mengganti sNeedle di sHaystack dengan sReplace, dan sNeedle dan sReplace tidak perlu memiliki ukuran yang sama. Rutin ini menggunakan loop sementara untuk menggantikan semua kejadian, bukan hanya yang pertama ditemukan dari kiri ke kanan.sumber
find
panggilan dua kali. Pertimbangkan menjadikan hasil itu sebagai variabel temp.Seperti yang disarankan Kirill, baik menggunakan metode ganti atau beralih sepanjang string menggantikan masing-masing karakter secara mandiri.
Atau Anda dapat menggunakan
find
metode ini ataufind_first_of
tergantung pada apa yang perlu Anda lakukan. Tak satu pun dari solusi ini akan melakukan pekerjaan sekaligus, tetapi dengan beberapa baris kode tambahan Anda harus membuatnya bekerja untuk Anda. :-)sumber
sumber
word
panjang, mungkin ada banyak overhead saat memanggil fungsi. Anda dapat mengoptimalkan ini dengan melewatiword
,target
danreplacement
sebagai const-referensi.Bagaimana dengan Abseil StrReplaceAll ? Dari file header:
sumber
Sekolah Lama :-)
Hasil:
sumber
Ini bekerja! Saya menggunakan sesuatu yang mirip dengan ini untuk aplikasi toko buku, di mana inventaris disimpan dalam CSV (seperti file .dat). Tetapi dalam kasus char tunggal, artinya replacer hanya char tunggal, misalnya '|', harus dalam tanda kutip ganda "|" agar tidak membuang char const konversi yang tidak valid.
Biasanya saya menggunakan CentOS saat ini, jadi versi kompiler saya ada di bawah ini. Versi C ++ (g ++), standar C ++ 98:
sumber
Jika Anda ingin menggunakan
std::string
s, Anda dapat menggunakanstrsub
fungsi aplikasi sampel ini apa adanya, atau memutakhirkannya jika Anda ingin menggunakan jenis atau set parameter yang berbeda untuk mencapai kira-kira tujuan yang sama. Pada dasarnya, ia menggunakan properti dan fungsistd::string
untuk dengan cepat menghapus set karakter yang cocok, dan menyisipkan karakter yang diinginkan langsung di dalamstd::string
. Setiap kali ia melakukan operasi penggantian ini, offset akan diperbarui jika masih dapat menemukan karakter yang cocok untuk diganti, dan jika tidak bisa karena tidak ada lagi yang harus diganti, ia mengembalikan string dalam keadaannya dari pembaruan terakhir.Jika Anda tidak ingin mengandalkan menggunakan
std::string
s sebagai parameter sehingga Anda dapat meneruskan string C-style, Anda dapat melihat sampel yang diperbarui di bawah ini:sumber
Untuk situasi sederhana ini berfungsi dengan baik tanpa menggunakan perpustakaan lain lalu std :: string (yang sudah digunakan).
Ganti semua kemunculan karakter a dengan karakter b di some_string :
Jika string besar atau beberapa panggilan untuk diganti adalah masalah, Anda dapat menerapkan teknik yang disebutkan dalam jawaban ini: https://stackoverflow.com/a/29752943/3622300
sumber
inilah solusi yang saya putar, dalam semangat DRI maksimal. ia akan mencari sNeedle di sHaystack dan menggantinya dengan sReplace, nTimes jika bukan 0, kalau tidak semua kejadian sNeedle. itu tidak akan mencari lagi dalam teks yang diganti.
sumber