Anda dapat menggunakan std::string::find()
fungsi ini untuk menemukan posisi pembatas string Anda, lalu gunakan std::string::substr()
untuk mendapatkan token.
Contoh:
std::string s = "scott>=tiger";
std::string delimiter = ">=";
std::string token = s.substr(0, s.find(delimiter)); // token is "scott"
The find(const string& str, size_t pos = 0)
fungsi mengembalikan posisi kejadian pertama dari str
dalam string, atau npos
jika string tidak ditemukan.
The substr(size_t pos = 0, size_t n = npos)
mengembalikan fungsi substring objek, mulai dari posisi pos
dan panjang npos
.
Jika Anda memiliki beberapa pembatas, setelah Anda mengekstrak satu token, Anda dapat menghapusnya (termasuk pembatas) untuk melanjutkan dengan ekstraksi berikutnya (jika Anda ingin mempertahankan string asli, gunakan saja s = s.substr(pos + delimiter.length());
):
s.erase(0, s.find(delimiter) + delimiter.length());
Dengan cara ini Anda dapat dengan mudah melakukan loop untuk mendapatkan setiap token.
Contoh Lengkap
std::string s = "scott>=tiger>=mushroom";
std::string delimiter = ">=";
size_t pos = 0;
std::string token;
while ((pos = s.find(delimiter)) != std::string::npos) {
token = s.substr(0, pos);
std::cout << token << std::endl;
s.erase(0, pos + delimiter.length());
}
std::cout << s << std::endl;
Keluaran:
scott
tiger
mushroom
size_t last = 0; size_t next = 0; while ((next = s.find(delimiter, last)) != string::npos) { cout << s.substr(last, next-last) << endl; last = next + 1; } cout << s.substr(last) << endl;
mushroom
output di luar loop, yaitus = mushroom
std::string token = s.substr(s.find(delimiter) + 1);
, jika Anda yakin itu ada (saya menggunakan +1 panjangnya) ...Metode ini menggunakan
std::string::find
tanpa mengubah string asli dengan mengingat awal dan akhir token substring sebelumnya.sumber
Anda dapat menggunakan fungsi berikutnya untuk memisahkan string:
sumber
split("abc","a")
akan mengembalikan vektor atau string tunggal"bc"
,, di mana saya pikir akan lebih masuk akal jika telah mengembalikan vektor elemen["", "bc"]
. Menggunakanstr.split()
Python, itu intuitif bagi saya bahwa itu harus mengembalikan string kosong jikadelim
ditemukan di awal atau di akhir, tapi itu hanya pendapat saya. Bagaimanapun, saya hanya berpikir itu harus disebutkanif (!token.empty())
mencegah masalah yang disebutkan oleh @kyriakosSt serta masalah lain yang terkait dengan pembatas berturut-turut.if (!token.empty())
sepertinya tidak cukup untuk memperbaikinya.Untuk pembatas string
Membagi string berdasarkan pembatas string . Seperti memisahkan string
"adsf-+qwret-+nvfkbdsj-+orthdfjgh-+dfjrleih"
berdasarkan pembatas string"-+"
, output akan{"adsf", "qwret", "nvfkbdsj", "orthdfjgh", "dfjrleih"}
Keluaran
Untuk pembatas karakter tunggal
Pisahkan string berdasarkan pembatas karakter. Seperti memisahkan string
"adsf+qwer+poui+fdgh"
dengan pembatas"+"
akan ditampilkan{"adsf", "qwer", "poui", "fdg"h}
Keluaran
sumber
vector<string>
saya pikir itu akan memanggil copy constructor.Kode ini memisahkan garis dari teks, dan menambahkan semua orang ke dalam vektor.
Dipanggil oleh:
sumber
vector<string> split(char *phrase, const string delimiter="\n")
strtok memungkinkan Anda untuk melewati beberapa karakter sebagai pembatas. Saya bertaruh jika Anda memasukkan "> =" string contoh Anda akan dipisah dengan benar (meskipun> dan = dihitung sebagai pembatas individu).
EDIT jika Anda tidak ingin menggunakan
c_str()
untuk mengkonversi dari string ke char *, Anda dapat menggunakan substr dan find_first_of untuk tokenize.sumber
strtok()
karena akan mengharuskan saya untuk menggunakan array char bukan string..c_str()
murah dan mudah juga.Inilah pendapat saya tentang ini. Ini menangani kasus tepi dan mengambil parameter opsional untuk menghapus entri kosong dari hasil.
Contohnya
sumber
Ini harus bekerja dengan sempurna untuk pembatas string (atau karakter tunggal). Jangan lupa untuk memasukkan
#include <sstream>
.Loop sementara pertama mengekstraksi token menggunakan karakter pertama dari pembatas string. Loop kedua sementara melompati sisa pembatas dan berhenti pada awal token berikutnya.
sumber
Saya akan menggunakan
boost::tokenizer
. Berikut dokumentasi yang menjelaskan cara membuat fungsi tokenizer yang sesuai: http://www.boost.org/doc/libs/1_52_0/libs/tokenizer/tokenizerfunction.htmIni salah satu yang sesuai untuk kasus Anda.
sumber
Jawaban sudah ada, tetapi dipilih-jawaban menggunakan fungsi hapus yang sangat mahal, pikirkan beberapa string yang sangat besar (dalam MB). Karena itu saya menggunakan fungsi di bawah ini.
sumber
string.split()
metode Python .)Ini adalah metode lengkap yang memisahkan string pada pembatas apa pun dan mengembalikan vektor string yang dicacah.
Ini adalah adaptasi dari jawaban dari ryanbwork. Namun, pemeriksaannya untuk:
if(token != mystring)
memberikan hasil yang salah jika Anda memiliki elemen berulang dalam string Anda. Ini solusi saya untuk masalah itu.sumber
while (true)
ini biasanya menakutkan untuk dilihat dalam kode seperti ini. Secara pribadi saya akan merekomendasikan menulis ulang ini sehingga perbandinganstd::string::npos
(atau masing-masing cek terhadapmystring.size()
) membuatwhile (true)
usang.Jika Anda tidak ingin memodifikasi string (seperti dalam jawaban oleh Vincenzo Pii) dan ingin menampilkan token terakhir juga, Anda mungkin ingin menggunakan pendekatan ini:
sumber
PS: Hanya berfungsi jika panjang senar setelah pemisahan sama
sumber
Fungsi:
Unit-tes:
sumber
sumber
sumber