แม้จะรู้ว่าคุณเคยเห็นว่าพวกเขาทำเช่นเดียวกันหรือที่. data () เรียก. c_str () มันไม่ถูกต้องที่จะคิดว่านี่จะเป็นกรณีสำหรับคอมไพเลอร์อื่น ๆ อาจเป็นไปได้ว่าคอมไพเลอร์ของคุณจะเปลี่ยนไปพร้อมกับรุ่นในอนาคต
2 เหตุผลในการใช้ std :: string:
std :: string สามารถใช้ได้กับทั้งข้อความและข้อมูลไบนารีโดยพลการ
std::string s1;
s1 = "abc";
std::string s2;
s2.append("a\0b\0b\0", 6);
คุณควรใช้เมธอด. c_str () เมื่อคุณใช้สตริงของคุณดังตัวอย่างที่ 1
คุณควรใช้เมธอด. data () เมื่อคุณใช้สตริงของคุณเป็นตัวอย่าง 2 ไม่ใช่เพราะการใช้. c_str () ในกรณีเหล่านี้เป็นเรื่องที่น่ากลัว แต่เนื่องจากคุณกำลังทำงานกับข้อมูลไบนารีให้ผู้อื่นตรวจสอบอย่างชัดเจน รหัสของคุณ
ข้อผิดพลาดที่อาจเกิดขึ้นกับการใช้. data ()
รหัสต่อไปนี้ไม่ถูกต้องและอาจทำให้เกิดข้อผิดพลาดในโปรแกรมของคุณ:
std::string s;
s = "abc";
char sz[512];
strcpy(sz, s.data());
เหตุใดจึงเป็นเรื่องปกติที่ผู้ใช้ที่ทำให้. data () และ. c_str () ทำสิ่งเดียวกัน
เนื่องจากมีประสิทธิภาพมากกว่าในการทำเช่นนั้น วิธีเดียวที่จะทำให้. data () ส่งคืนบางสิ่งที่ไม่ถูกยกเลิกด้วย null คือการมี. c_str () หรือ. data () คัดลอกบัฟเฟอร์ภายในของมันหรือใช้เพียง 2 บัฟเฟอร์ การมีบัฟเฟอร์ที่สิ้นสุดด้วย null เพียงครั้งเดียวหมายความว่าคุณสามารถใช้บัฟเฟอร์ภายในเพียงตัวเดียวเมื่อใช้ std :: string
.data()
ด้วยดังนั้นจึงไม่เทียบเท่ากับสตริงที่ไม่คงที่อีกต่อไป