Apa arti frasa std::string::npos
dalam cuplikan kode berikut?
found = str.find(str2);
if (found != std::string::npos)
std::cout << "first 'needle' found at: " << int(found) << std::endl;
c++
stdstring
c++-standard-library
ledakan
sumber
sumber
cout<<"pos: "<<str.find("not in the string")<<" npos: "<<std::string::npos;
dan mendapatkanpos:4294967295 npos: 4294967295
ketika saya menjalankannya di Windows tetapi di Mac saya dapatkanpos:4294967295 npos: 18446744073709551615
. Itu tidak benar ... baik cara saya sarankan dibandingkan dengan-1
bukanstd::string::npos
string::npos
adalah konstanta (mungkin-1
) mewakili non-posisi. Ini dikembalikan oleh metodefind
ketika pola tidak ditemukan.sumber
Dokumen untuk
string::npos
mengatakan:sumber
size_t
adalah variabel unsigned, jadi 'unsigned value = - 1' secara otomatis menjadikannya nilai terbesar untuksize_t
: 18446744073709551615sumber
std::string::npos
adalah implementasi yang ditentukan indeks yang selalu di luar batas dari setiapstd::string
contoh. Berbagaistd::string
fungsi mengembalikannya atau menerimanya sebagai sinyal di luar akhir situasi string. Ini biasanya dari beberapa tipe integer unsigned dan nilainya biasanyastd::numeric_limits<std::string::size_type>::max ()
(berkat promosi integer standar) biasanya sebanding dengan-1
.sumber
kita harus menggunakan
string::size_type
tipe kembalian dari fungsi find jika tidak, perbandingannyastring::npos
mungkin tidak berfungsi.size_type
, yang ditentukan oleh pengalokasi string, harus berupaunsigned
tipe integral. Pengalokasi default, pengalokasi, menggunakan tipesize_t
sebagaisize_type
. Karena-1
diubah menjadi tipe integral unsigned, npos adalah nilai unsigned maksimum dari tipenya. Namun, nilai pastinya bergantung pada definisi jenis yang tepatsize_type
. Sayangnya, nilai maksimum ini berbeda. Faktanya,(unsigned long)-1
berbeda dari(unsigned short)-
1 jika ukuran jenisnya berbeda. Demikian perbandingannyaidx == std::string::npos
mungkin menghasilkan false jika idx memiliki nilai
-1
dan idx danstring::npos
memiliki tipe yang berbeda:std::string s; ... int idx = s.find("not found"); // assume it returns npos if (idx == std::string::npos) { // ERROR: comparison might not work ... }
Salah satu cara untuk menghindari kesalahan ini adalah dengan memeriksa apakah pencarian gagal secara langsung:
if (s.find("hi") == std::string::npos) { ... }
Namun, seringkali Anda membutuhkan indeks posisi karakter yang cocok. Jadi, solusi sederhana lainnya adalah menentukan nilai yang Anda tandatangani sendiri untuk npos:
const int NPOS = -1;
Sekarang perbandingannya terlihat sedikit berbeda dan bahkan lebih nyaman:
if (idx == NPOS) { // works almost always ... }
sumber
found
akan terjadinpos
jika gagal menemukan substring dalam string pencarian.sumber
$21.4 - "static const size_type npos = -1;"
Itu dikembalikan oleh fungsi string yang menunjukkan kesalahan / tidak ditemukan dll.
sumber
Nilai string :: npos adalah 18446744073709551615. Ini adalah nilai yang dikembalikan jika tidak ada string yang ditemukan.
sumber
18446744073709551615
akan menjadi tipikal untuk 64-bitstd::size_t
, itu adalah nilai unsigned maksimum 64-bit.npos hanyalah nilai token yang memberi tahu Anda bahwa find () tidak menemukan apa pun (mungkin -1 atau sesuatu seperti itu). find () memeriksa kemunculan pertama parameter, dan mengembalikan indeks di mana parameter dimulai. Sebagai contoh,
string name = "asad.txt"; int i = name.find(".txt"); //i holds the value 4 now, that's the index at which ".txt" starts if (i==string::npos) //if ".txt" was NOT found - in this case it was, so this condition is false name.append(".txt");
sumber
statis ukuran_t konstanta npos = -1;
Nilai maksimum untuk size_t
npos adalah nilai konstanta anggota statis dengan kemungkinan nilai terbesar untuk elemen tipe size_t.
Nilai ini, bila digunakan sebagai nilai untuk parameter len (atau sublen) dalam fungsi anggota string, berarti "sampai akhir string".
Sebagai nilai yang dikembalikan, biasanya digunakan untuk menunjukkan tidak ada kecocokan.
Konstanta ini didefinisikan dengan nilai -1, yang karena size_t adalah tipe integral unsigned, ini adalah nilai terwakili terbesar yang mungkin untuk jenis ini.
sumber
Jawaban untuk C ++ 17 saat ini, ketika kita memiliki
std::optional
:Jika Anda menyipitkan mata sedikit dan berpura-pura
std::string::find()
mengembalikanstd::optional<std::string::size_type>
(yang seharusnya ...) - maka kondisinya menjadi:auto position = str.find(str2); if ( position.has_value() ) { std::cout << "first 'needle' found at: " << found.value() << std::endl; }
sumber