วลีนี้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;
}