Misalnya saya meminta pengguna memasukkan nomor telepon.
cout << "Enter phone number: ";
INPUT: (555) 555-5555
cin >> phone;
Saya ingin menghapus karakter "(", ")", dan "-" dari string. Saya telah melihat string hapus, temukan dan ganti fungsi namun saya hanya melihat bahwa mereka beroperasi berdasarkan posisi.
Apakah ada fungsi string yang dapat saya gunakan untuk meneruskan karakter, "(" misalnya, dan apakah fungsi tersebut menghapus semua instance dalam string?
std::remove
memindahkan item yang tidak dihapus ke depan vektor dan mengembalikan iterator yang menunjuk tepat di luar item terakhir yang tidak dihapus. Kemudianstd::erase
potong vektor dari iterator itu ke akhir.string chars("()-");
dan kemudian menggunakan.length()
metode untuk mendapatkan panjang dan.at(i)
metode untuk mengakses karakter :) Functionized biola - ideone.com/tAZt5I<iostream>
<algorithm>
<cstring>
Anda dapat menggunakan
std::remove_if()
algoritme untuk menghapus hanya karakter yang Anda tentukan:The
std::remove_if()
algoritma membutuhkan sesuatu yang disebut predikat, yang dapat menjadi pointer fungsi seperti potongan di atas.Anda juga dapat mengirimkan objek fungsi (objek yang membebani
()
operator pemanggil fungsi ). Ini memungkinkan kami membuat solusi yang lebih umum:Anda dapat menentukan karakter apa yang akan dihapus dengan
"()- "
string. Dalam contoh di atas saya menambahkan spasi sehingga spasi dihapus serta tanda kurung dan tanda hubung.sumber
ispunct(int c)
remove_if () telah disebutkan. Namun, dengan C ++ 0x, Anda dapat menentukan predikatnya dengan lambda.
Di bawah ini adalah contohnya dengan 3 cara berbeda untuk melakukan pemfilteran. Versi "copy" dari fungsi-fungsi tersebut juga disertakan untuk kasus-kasus ketika Anda bekerja dengan sebuah const atau tidak ingin mengubah aslinya.
sumber
Berikut adalah solusi berbeda untuk siapa pun yang tertarik. Ini menggunakan rentang For baru di c ++ 11
sumber
str2
inisialisasi tidak diperlukan. (2)str = std::move(str2)
akan lebih efisien.Saya khawatir tidak ada anggota seperti itu untuk std :: string, tetapi Anda dapat dengan mudah memprogram fungsi semacam itu. Ini mungkin bukan solusi tercepat, tetapi ini sudah cukup:
EDIT: Membaca jawaban di bawah ini, saya memahaminya secara lebih umum, tidak hanya untuk mendeteksi digit. Solusi di atas akan menghilangkan setiap karakter yang diteruskan dalam string argumen kedua. Sebagai contoh:
Akan menghasilkan
sumber
Catatan: Mungkin Anda perlu menulis
ptr_fun<int, int>
daripada sederhanaptr_fun
sumber
std::cref
ataustd::function
(atau lambda).Ya, Anda dapat menggunakan fungsi isdigit () untuk memeriksa digit :)
Ini dia:
Semoga membantu :)
sumber
boost::is_any_of
Strip untuk semua karakter dari satu string yang muncul di string lain yang diberikan:
Diuji di Ubuntu 16.04, Boost 1.58.
sumber
Jika Anda memiliki akses ke kompiler yang mendukung template variadic, Anda dapat menggunakan ini:
sumber
Berikut alternatif lain:
Bekerja dengan std :: string dan std :: wstring
sumber
Saya baru, tetapi beberapa jawaban di atas sangat rumit, jadi inilah alternatifnya.
CATATAN: Selama 0-9 bersebelahan (yang harus sesuai dengan standar), ini harus menyaring semua karakter lain kecuali angka dan ''. Mengetahui 0-9 harus bersebelahan dan char benar-benar int, kita dapat melakukan hal di bawah ini.
EDIT: Saya tidak melihat poster menginginkan ruang juga, jadi saya mengubahnya ...
Di bawah ini untuk memfilter karakter yang diberikan.
sumber
Menggunakan std :: wstring dan wchar_t (membutuhkan header Unicode ):
... penginisialisasi jarak statis mewah berikutnya; tidak perlu mengatur badChars2 dengan cara yang sama persis. Itu berlebihan; lebih akademis dari apa pun:
Lambda sederhana dan ringkas:
Menghapus semua karakter buruk dari ponsel
Keluaran: "555 5555555"
sumber
Bagi Anda yang lebih suka gaya pengkodean lambda yang lebih ringkas, lebih mudah dibaca ...
Contoh ini menghapus semua karakter non-alfanumerik dan spasi dari string lebar. Anda dapat mencampurnya dengan salah satu fungsi pembantu ctype.h lainnya untuk menghapus pengujian berbasis karakter yang tampak rumit.
(Saya tidak yakin bagaimana fungsi ini akan menangani bahasa CJK, jadi berjalanlah dengan lembut ke sana.)
Lihat jika Anda tidak menganggap ini lebih mudah untuk dipahami daripada loop C / C ++ untuk / iterator yang berisik:
hasil newLabel setelah menjalankan kode ini: " 1ReplenMoveRPMV "
Ini hanya akademis, karena jelas akan lebih tepat, ringkas dan efisien untuk menggabungkan logika 'if' dari lambda0 (first for_each ) ke dalam lambda1 tunggal (kedua for_each ), jika Anda telah menetapkan karakter mana yang menjadi "badChars" .
sumber
Banyak jawaban bagus, berikut adalah cara lain untuk membersihkan rangkaian angka, tidak menghapus karakter tetapi dengan memindahkan angka keluar.
sumber