วลีนี้std::string::npos
หมายความว่าอย่างไรในข้อมูลโค้ดต่อไปนี้
found = str.find(str2);
if (found != std::string::npos)
std::cout << "first 'needle' found at: " << int(found) << std::endl;
วลีนี้std::string::npos
หมายความว่าอย่างไรในข้อมูลโค้ดต่อไปนี้
found = str.find(str2);
if (found != std::string::npos)
std::cout << "first 'needle' found at: " << int(found) << std::endl;
คำตอบ:
หมายความว่าไม่พบ
โดยปกติจะกำหนดไว้ดังนี้:
static const size_t npos = -1;
จะดีกว่าถ้าเปรียบเทียบกับ npos แทนที่จะเป็น -1 เนื่องจากโค้ดนั้นอ่านง่ายกว่า
cout<<"pos: "<<str.find("not in the string")<<" npos: "<<std::string::npos;
และได้รับpos:4294967295 npos: 4294967295
เมื่อฉันใช้มันใน Windows แต่บน Mac pos:4294967295 npos: 18446744073709551615
ฉันได้รับ ดูเหมือนจะไม่ถูกต้อง ... แต่ฉันขอแนะนำให้เปรียบเทียบกับ-1
แทนstd::string::npos
string::npos
เป็นค่าคงที่ (อาจ-1
) แทนตำแหน่งที่ไม่ใช่ ส่งคืนโดยวิธีการfind
เมื่อไม่พบรูปแบบ
เอกสารสำหรับstring::npos
กล่าวว่า:
npos คือค่าคงที่ของสมาชิกคงที่ซึ่งมีค่ามากที่สุดสำหรับองค์ประกอบประเภท size_t
โดยปกติจะใช้เป็นค่าส่งคืนเพื่อระบุความล้มเหลว
ค่าคงที่นี้ถูกกำหนดด้วยค่า -1 (สำหรับลักษณะใด ๆ ) ซึ่งเนื่องจาก size_t เป็นชนิดอินทิกรัลที่ไม่ได้ลงนามจึงกลายเป็นค่าที่สามารถแสดงได้มากที่สุด
size_t
เป็นตัวแปรที่ไม่ได้ลงชื่อดังนั้น 'ค่าที่ไม่ได้ลงชื่อ = - 1' จะทำให้เป็นค่าที่มากที่สุดสำหรับsize_t
: 18446744073709551615 โดยอัตโนมัติ
std::string::npos
เป็นดัชนีที่กำหนดการนำไปใช้งานซึ่งมักจะอยู่นอกขอบเขตของstd::string
อินสแตนซ์ใด ๆ std::string
ฟังก์ชั่นต่างๆส่งคืนหรือยอมรับเพื่อส่งสัญญาณหลังจากสิ้นสุดสถานการณ์สตริง มันเป็นเรื่องปกติของบางชนิดจำนวนเต็มไม่ได้ลงนามและค่าที่เป็นมักจะstd::numeric_limits<std::string::size_type>::max ()
ซึ่งเป็น (ขอบคุณโปรโมชั่นจำนวนเต็มมาตรฐาน) -1
มักจะเปรียบได้กับ
เราต้องใช้string::size_type
สำหรับประเภท return ของฟังก์ชัน find มิฉะนั้นการเปรียบเทียบกับstring::npos
อาจใช้ไม่ได้
size_type
ซึ่งกำหนดโดยผู้จัดสรรสตริงต้องเป็นunsigned
ชนิดอินทิกรัล จัดสรรค่าเริ่มต้นจัดสรรใช้ประเภทเป็นsize_t
size_type
เนื่องจาก-1
ถูกแปลงเป็นชนิดอินทิกรัลที่ไม่ได้ลงนาม npos คือค่าสูงสุดที่ไม่ได้ลงชื่อของประเภท size_type
แต่ค่าที่แน่นอนขึ้นอยู่กับความหมายที่แท้จริงของประเภท น่าเสียดายที่ค่าสูงสุดเหล่านี้แตกต่างกัน ในความเป็นจริง(unsigned long)-1
แตกต่างจาก(unsigned short)-
1 หากขนาดของประเภทต่างกัน ดังนั้นการเปรียบเทียบ
idx == std::string::npos
อาจให้ผลเท็จหาก idx มีค่า-1
และ idx และstring::npos
มีประเภทต่างกัน:
std::string s;
...
int idx = s.find("not found"); // assume it returns npos
if (idx == std::string::npos) { // ERROR: comparison might not work
...
}
วิธีหนึ่งในการหลีกเลี่ยงข้อผิดพลาดนี้คือตรวจสอบว่าการค้นหาล้มเหลวโดยตรงหรือไม่:
if (s.find("hi") == std::string::npos) {
...
}
อย่างไรก็ตามบ่อยครั้งที่คุณต้องการดัชนีของตำแหน่งอักขระที่ตรงกัน ดังนั้นวิธีง่ายๆอีกวิธีหนึ่งคือการกำหนดค่าที่ลงชื่อของคุณเองสำหรับ npos:
const int NPOS = -1;
ตอนนี้การเปรียบเทียบดูแตกต่างกันเล็กน้อยและสะดวกยิ่งขึ้น:
if (idx == NPOS) { // works almost always
...
}
found
จะเป็นnpos
ในกรณีของความล้มเหลวที่จะหา substring ในสตริงค้นหา
$21.4 - "static const size_type npos = -1;"
ส่งคืนโดยฟังก์ชันสตริงที่ระบุข้อผิดพลาด / ไม่พบเป็นต้น
ค่าของ string :: npos คือ 18446744073709551615 ซึ่งเป็นค่าที่ส่งคืนหากไม่พบสตริง
18446744073709551615
จะเป็นปกติสำหรับ 64 บิตstd::size_t
เป็นค่าสูงสุด 64 บิตที่ไม่ได้ลงชื่อ
npos เป็นเพียงค่าโทเค็นที่บอกคุณว่า find () ไม่พบอะไรเลย (อาจเป็น -1 หรืออะไรทำนองนั้น) find () ตรวจสอบการเกิดขึ้นครั้งแรกของพารามิเตอร์และส่งกลับดัชนีที่พารามิเตอร์เริ่มต้น ตัวอย่างเช่น,
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");
คงที่ const size_t npos = -1;
ค่าสูงสุดสำหรับ size_t
npos คือค่าคงที่ของสมาชิกคงที่ซึ่งมีค่ามากที่สุดสำหรับองค์ประกอบประเภท size_t
ค่านี้เมื่อใช้เป็นค่าสำหรับพารามิเตอร์ len (หรือ sublen) ในฟังก์ชันสมาชิกของสตริงหมายความว่า "จนถึงจุดสิ้นสุดของสตริง"
ในฐานะที่เป็นค่าส่งกลับมักใช้เพื่อระบุว่าไม่มีการจับคู่
ค่าคงที่นี้กำหนดด้วยค่า -1 ซึ่งเนื่องจาก size_t เป็นชนิดอินทิกรัลที่ไม่ได้ลงนามจึงเป็นค่าที่สามารถแสดงค่าได้มากที่สุดสำหรับประเภทนี้
คำตอบสำหรับวันนี้ของ C ++ 17 เมื่อเรามีstd::optional
:
หากคุณเหล่เล็กน้อยและแสร้งทำเป็นstd::string::find()
ส่งกลับstd::optional<std::string::size_type>
(ซึ่งมันควรจะ ... ) - เงื่อนไขจะกลายเป็น:
auto position = str.find(str2);
if ( position.has_value() ) {
std::cout << "first 'needle' found at: " << found.value() << std::endl;
}