สตริงด้านล่างจะมีเครื่องหมาย null '\ 0' หรือไม่
std::string temp = "hello whats up";
ขอบคุณ! :)
สตริงด้านล่างจะมีเครื่องหมาย null '\ 0' หรือไม่
std::string temp = "hello whats up";
ขอบคุณ! :)
คำตอบ:
ไม่ แต่ถ้าคุณบอกว่าเทอร์มิเนเตอร์temp.c_str()ว่างจะรวมอยู่ในผลตอบแทนจากวิธีนี้
นอกจากนี้ยังควรค่าแก่การบอกว่าคุณสามารถใส่อักขระว่างในสตริงได้เช่นเดียวกับอักขระอื่น ๆ
string s("hello");
cout << s.size() << ' ';
s[1] = '\0';
cout << s.size() << '\n';
พิมพ์
5 5
และไม่ใช่5 1อย่างที่คุณคาดหวังหากอักขระ null มีความหมายพิเศษสำหรับสตริง
temp.c_str()ใช้อักขระ null จะรวมอยู่ด้วย หากคุณต้องการจริงๆในสตริงให้เพิ่มเหมือนอักขระอื่น ๆ temp.push_back('\0'). ตอนนี้temp.c_str()จะรวมอักขระว่างสองตัว
                    ไม่ได้อยู่ใน C ++ 03 และไม่มีการรับประกันก่อน C ++ 11 ว่าในสตริง C ++ std :: นั้นต่อเนื่องในหน่วยความจำ เฉพาะสตริง C (อาร์เรย์ถ่านที่มีไว้สำหรับจัดเก็บสตริง) เท่านั้นที่มีตัวยุติเป็นโมฆะ
ใน C ++ 11 และหลังจากนั้นmystring.c_str()จะเทียบเท่ากับmystring.data()เทียบเท่ากับ&mystring[0]และรับประกันได้ว่าจะmystring[mystring.size()]'\0'
ขึ้นอยู่กับคำจำกัดความของ "มี" ที่นี่ ใน
std::string temp = "hello whats up";
มีบางสิ่งที่ควรทราบ:
temp.size()จะส่งคืนจำนวนอักขระจากตัวแรกhถึงตัวสุดท้ายp(รวมทั้งคู่)temp.c_str()หรือtemp.data()จะกลับมาพร้อมกับเทอร์nullมิเนเตอร์int(temp[temp.size()])จะเป็นศูนย์ฉันรู้ว่าฉันเสียงคล้ายกับบางส่วนของคำตอบที่นี่ แต่ผมอยากจะชี้ให้เห็นว่าsizeของstd::stringในC++จะถูกเก็บรักษาไว้ที่แยกจากกันและมันก็ไม่เหมือนในCที่คุณเก็บนับจนกว่าคุณจะพบคนแรกที่nullเทอร์มิ
หากต้องการเพิ่มเรื่องราวจะแตกต่างกันเล็กน้อยหากstring literalมีการฝังของ\0คุณ ในกรณีนี้การสร้างstd::stringจุดหยุดที่nullอักขระตัวแรกดังต่อไปนี้:
std::string s1 = "ab\0\0cd";   // s1 contains "ab",       using string literal
std::string s2{"ab\0\0cd", 6}; // s2 contains "ab\0\0cd", using different ctr
std::string s3 = "ab\0\0cd"s;  // s3 contains "ab\0\0cd", using ""s operator
อ้างอิง:
ใช่ถ้าคุณโทรtemp.c_str()มันจะส่งคืน c-string ที่สิ้นสุดด้วย null
อย่างไรก็ตามข้อมูลจริงที่จัดเก็บในออบเจ็กต์tempอาจไม่ถูกยกเลิกด้วยค่าว่าง แต่ก็ไม่สำคัญและไม่ควรมีความสำคัญกับโปรแกรมเมอร์เพราะเมื่อนั้นโปรแกรมเมอร์ต้องการconst char*เขาจะเรียกc_str()ใช้วัตถุซึ่งรับประกันว่าจะคืนค่าว่าง -terminated สตริง
temp.size()จะรวมอยู่ในผลตอบแทนจาก
                    ด้วยสตริง C ++ คุณไม่ต้องกังวลเกี่ยวกับเรื่องนี้และอาจขึ้นอยู่กับการนำไปใช้งาน
การใช้temp.c_str()คุณจะได้รับ C แทนสตริงซึ่งจะมี\0อักขระอยู่แน่นอน นอกเหนือจากนั้นฉันไม่เห็นว่ามันจะมีประโยชน์กับสตริง C ++ อย่างไร
std::stringเก็บจำนวนอักขระไว้ภายใน ภายในใช้งานได้โดยใช้การนับนี้ เช่นเดียวกับคนอื่น ๆ ได้กล่าวไว้เมื่อคุณต้องการสตริงสำหรับการแสดงผลหรือเหตุผลใดก็ตามคุณสามารถc_str()ใช้วิธีการซึ่งจะให้สตริงที่มีตัวยุติเป็นโมฆะในตอนท้าย