คุณต้องการสตริงที่สิ้นสุดด้วยค่า null ในสถานการณ์แบบอ่านอย่างเดียวเมื่อใด


10

ฉันได้เล่นกับstd::string_viewห้องสมุดและฉันได้ไตร่ตรองเกี่ยวกับการเปลี่ยนรหัสฐานที่ฉันได้พยายามใช้std::string_viewให้มากที่สุด อย่างไรก็ตามในหลายหัวข้อที่ผมได้อ่านในเรื่องของเวลาและสถานที่ที่จะใช้แทนstd::string_view const std::string &ฉันเห็นคำตอบมากมายว่า "เมื่อคุณไม่ต้องการสตริงที่สิ้นสุดด้วยค่า null" ดังนั้นเมื่อฉันเริ่มค้นหาเว็บ "คุณต้องการสตริงที่สิ้นสุดด้วยค่า null เมื่อใด" ฉันไม่ได้เจอคำตอบที่เป็นประโยชน์ในเรื่องนี้จริงๆ

ฉันนึกถึงตัวอย่างของstd::stringไลบรารี่ภายนอกที่คุณจะต้องลิงค์ไปถึง และในกรณีนั้นคุณจะต้องใช้สตริงที่สิ้นสุดด้วยค่า null เนื่องจากไลบรารีนั้นต้องการ ฉันเดาอีกตัวอย่างหนึ่งคือหากคุณต้องการแก้ไขสตริงเอง แต่จากนั้นเราจะไม่ผ่านมันconst &หากเราต้องการแก้ไขมัน

ดังนั้นเมื่อใดที่คุณจะต้องใช้สตริงที่สิ้นสุดด้วยค่า Null?

ลิงค์ที่ฉันได้ดู:

  1. std :: string_view เร็วกว่า const std :: string & อย่างไร
  2. เมื่อใดที่ฉันจะส่งผ่าน const & std :: string แทนที่จะเป็น std :: string_view
  3. เหตุใดจึงต้องดูสตริง
  4. มีความหมายในการใช้ const std :: string & arguments ใน C ++ 17 หรือไม่

5
เพื่อเชื่อมต่อกับ C APIs ส่วนใหญ่
walnut

@uneven_mark คุณสามารถให้ตัวอย่างหนึ่งได้หรือไม่
Sailanarmo

คำตอบที่ได้รับการยอมรับสำหรับคำถามที่สี่ที่คุณลิงค์ดูเหมือนจะตอบคำถามนี้
François Andrieux

1
@Sailanarmo ฟังก์ชั่นส่วนใหญ่จากเช่น POSIX หรือห้องสมุด C อื่น ๆ การconst char*โต้แย้ง eerorika's anwer มีตัวอย่าง
walnut

1
@ FrançoisAndrieuxคำตอบก็คือ "ตราบใดที่ API ไม่เรียกใช้สตริงที่สิ้นสุดด้วยค่า Null?"
Sailanarmo

คำตอบ:


10

คุณต้องการสตริงที่สิ้นสุดด้วยค่า null เมื่อใด?

คุณต้องมีสตริงที่สิ้นสุดด้วยค่า null เมื่อใดก็ตามที่ API ที่คุณใช้ระบุว่าคุณต้องการ ข้อกำหนดนี้แพร่หลายใน C interfaces และไม่ได้ระบุไว้อย่างชัดเจนในเอกสารบางอย่าง หากอาร์กิวเมนต์ของฟังก์ชันนั้นเป็นchar*(อาจเป็น const) และไม่มีอาร์กิวเมนต์ที่มีความยาวคุณควรถือว่าข้อกำหนดนั้นเป็นจริง

ลองทำฟังก์ชั่นexecve(จากมาตรฐาน POSIX) เป็นตัวอย่าง:

int execve(const char *pathname, char *const argv[], char *const envp[]);

หากคุณผ่านการโต้แย้งที่ไม่เป็นโมฆะในขณะpathnameนั้นพฤติกรรมของโปรแกรมของคุณจะไม่ถูกกำหนด


ดังนั้นในกรณีนี้ชื่อพา ธ ที่จะเป็นstd::stringจะถูกดำเนินการเช่นexecve(pathname.c_str(),...,...)?
Sailanarmo

6

เป็นเรื่องง่ายที่จะรู้ หากคุณกำลังเรียกใช้ฟังก์ชั่นที่เพิ่งใช้ c-string ( char*/ const char*) คุณจะต้องใช้สตริงที่ถูกยกเลิกค่า null เนื่องจากเป็นวิธีเดียวที่จะรู้ว่าจุดสิ้นสุดของสตริงนั้นคืออะไร

หากคุณมีฟังก์ชั่นที่ใช้char*/ const char*บวกขนาดหรือเพียงสองพอยน์เตอร์ที่ทำเครื่องหมายจุดเริ่มต้นและจุดสิ้นสุดของข้อมูลคุณไม่จำเป็นต้องมีสตริงที่สิ้นสุดด้วยค่า null เนื่องจากคุณมี / สามารถรับขนาดสตริงโดยไม่ต้องวนซ้ำ ตัวสิ้นสุด null

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