สตริงด้านล่างจะมีเครื่องหมาย 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()
ใช้วิธีการซึ่งจะให้สตริงที่มีตัวยุติเป็นโมฆะในตอนท้าย