string :: npos หมายความว่าอย่างไรในรหัสนี้


97

วลีนี้std::string::nposหมายความว่าอย่างไรในข้อมูลโค้ดต่อไปนี้

found = str.find(str2);

if (found != std::string::npos)
    std::cout << "first 'needle' found at: " << int(found) << std::endl;

คำตอบ:


110

หมายความว่าไม่พบ

โดยปกติจะกำหนดไว้ดังนี้:

static const size_t npos = -1;

จะดีกว่าถ้าเปรียบเทียบกับ npos แทนที่จะเป็น -1 เนื่องจากโค้ดนั้นอ่านง่ายกว่า


3
การเปรียบเทียบ == -1 อาจทำให้บางคนคิดว่าพวกเขาสามารถแปลงสิ่งนั้นเป็น <0 ซึ่งไม่ใช่สิ่งเดียวกันและจะไม่ได้ผล
Andy Dent

เพียงแค่สงสัยว่าถ้าใครได้เจอนี้หรือจะเป็นเพียงฉัน ... ฉันทำงาน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
user1135469

@ user1135469 ถ้าคุณเห็นคำตอบของ codaddict bellow ( stackoverflow.com/a/3827997/752842 ) หรือของ Sebastian Raschka ฉันคิดว่าสิ่งที่คุณได้รับจะสมเหตุสมผล และฉันอยากจะแนะนำให้ใช้ npos เพราะฉันลองใช้ -1 และมันทำงานไม่ถูกต้องภายใต้เงื่อนไขที่ฉันใช้อยู่
Dzyann

51

string::nposเป็นค่าคงที่ (อาจ-1) แทนตำแหน่งที่ไม่ใช่ ส่งคืนโดยวิธีการfindเมื่อไม่พบรูปแบบ


15
+1 สำหรับการแสดงอนุพันธ์ npos = no-pos ที่ทำให้จำได้ง่าย เห็นได้ชัดว่าคุณจะไม่คิดถึงเรื่องนี้เมื่อคุณรู้ แต่สำหรับคนที่เห็นตัวอักษรเหล่านั้นเป็นครั้งแรกอาจไม่คลิก ... ?
Tony Delroy

4
ผิดใน 47 ระดับ ... npos เป็น size_t หมายความว่ามันไม่สามารถลบได้ ... ความหมายที่แท้จริงคือ max_index, 18446744073709551615 สำหรับ 64 บิต size_t
NoSenseEtAl

25

เอกสารสำหรับstring::nposกล่าวว่า:

npos คือค่าคงที่ของสมาชิกคงที่ซึ่งมีค่ามากที่สุดสำหรับองค์ประกอบประเภท size_t

โดยปกติจะใช้เป็นค่าส่งคืนเพื่อระบุความล้มเหลว

ค่าคงที่นี้ถูกกำหนดด้วยค่า -1 (สำหรับลักษณะใด ๆ ) ซึ่งเนื่องจาก size_t เป็นชนิดอินทิกรัลที่ไม่ได้ลงนามจึงกลายเป็นค่าที่สามารถแสดงได้มากที่สุด


17

size_tเป็นตัวแปรที่ไม่ได้ลงชื่อดังนั้น 'ค่าที่ไม่ได้ลงชื่อ = - 1' จะทำให้เป็นค่าที่มากที่สุดสำหรับsize_t: 18446744073709551615 โดยอัตโนมัติ


size_t เป็น int ที่ไม่ได้ลงนามสำหรับคอมไพเลอร์ 32 บิต int long long ที่ไม่ได้ลงชื่อสำหรับคอมไพเลอร์ 64 บิต .. การตั้งค่าเป็น -1 ทำให้มีค่าสูงสุดของชนิดที่ไม่ได้ลงนามนั้น
sudheerbb

9

std::string::nposเป็นดัชนีที่กำหนดการนำไปใช้งานซึ่งมักจะอยู่นอกขอบเขตของstd::stringอินสแตนซ์ใด ๆ std::stringฟังก์ชั่นต่างๆส่งคืนหรือยอมรับเพื่อส่งสัญญาณหลังจากสิ้นสุดสถานการณ์สตริง มันเป็นเรื่องปกติของบางชนิดจำนวนเต็มไม่ได้ลงนามและค่าที่เป็นมักจะstd::numeric_limits<std::string::size_type>::max ()ซึ่งเป็น (ขอบคุณโปรโมชั่นจำนวนเต็มมาตรฐาน) -1มักจะเปรียบได้กับ


4

เราต้องใช้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
...
}

3

foundจะเป็นnposในกรณีของความล้มเหลวที่จะหา substring ในสตริงค้นหา



1

ค่าของ string :: npos คือ 18446744073709551615 ซึ่งเป็นค่าที่ส่งคืนหากไม่พบสตริง


ค่าที่แท้จริงคือการนำไปใช้งานที่กำหนดไว้และไม่เกี่ยวข้อง อย่างไรก็ตามในทางปฏิบัติค่า18446744073709551615จะเป็นปกติสำหรับ 64 บิตstd::size_tเป็นค่าสูงสุด 64 บิตที่ไม่ได้ลงชื่อ
Alex Guteniev

0

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");

รหัสนี้จะไม่เวิร์กสำหรับ "asad.other" เนื่องจาก find () ไม่ส่งคืน int
LogicMagic

0

คงที่ const size_t npos = -1;

ค่าสูงสุดสำหรับ size_t

npos คือค่าคงที่ของสมาชิกคงที่ซึ่งมีค่ามากที่สุดสำหรับองค์ประกอบประเภท size_t

ค่านี้เมื่อใช้เป็นค่าสำหรับพารามิเตอร์ len (หรือ sublen) ในฟังก์ชันสมาชิกของสตริงหมายความว่า "จนถึงจุดสิ้นสุดของสตริง"

ในฐานะที่เป็นค่าส่งกลับมักใช้เพื่อระบุว่าไม่มีการจับคู่

ค่าคงที่นี้กำหนดด้วยค่า -1 ซึ่งเนื่องจาก size_t เป็นชนิดอินทิกรัลที่ไม่ได้ลงนามจึงเป็นค่าที่สามารถแสดงค่าได้มากที่สุดสำหรับประเภทนี้


0

คำตอบสำหรับวันนี้ของ 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;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.