Kapan Anda membutuhkan string yang diakhiri null dalam skenario hanya baca?

10

Saya telah bermain-main dengan std::string_viewperpustakaan dan saya telah memikirkan untuk mengubah basis kode yang telah saya coba untuk menggunakan std::string_viewsebanyak mungkin. Namun, di banyak thread yang saya telah membaca tentang masalah kapan dan di mana untuk menggunakan std::string_viewbukan const std::string &. Saya telah melihat banyak jawaban mengatakan, "Ketika Anda tidak membutuhkan string yang diakhiri dengan nol." Jadi ketika saya mulai mencari di web, "kapan Anda membutuhkan string yang diakhiri?" Saya belum menemukan jawaban yang membantu tentang masalah ini.

Saya dapat memikirkan contoh perpustakaan eksternal yang akan Anda tautkan ke yang memerlukan a std::string. Dan dalam hal ini Anda akan membutuhkan string yang diakhiri null karena perpustakaan itu mengharuskannya. Saya kira contoh lain adalah jika Anda perlu memodifikasi string itu sendiri, tetapi kemudian kita tidak akan melewatinya const &jika kita perlu memodifikasinya.

Jadi kapan Anda perlu menggunakan string yang dihentikan nol?

Tautan yang telah saya lihat:

  1. Bagaimana tepatnya std :: string_view lebih cepat daripada const std :: string &?
  2. Kapan saya akan meneruskan const & std :: string daripada std :: string_view?
  3. Mengapa hanya melihat string?
  4. Apakah ada gunanya menggunakan const std :: string & argumen di C ++ 17?
Sailanarmo
sumber
5
Untuk berinteraksi dengan C API, kebanyakan.
kenari
@uneven_mark dapatkah Anda memberikan contohnya?
Sailanarmo
Jawaban yang diterima untuk pertanyaan keempat yang Anda tautkan sepertinya menjawab pertanyaan ini.
François Andrieux
1
@Sailanarmo Kebanyakan fungsi dari mis. POSIX atau pustaka C lain yang mengambil const char*argumen eerorika's anwer memiliki contoh.
kenari
1
@ FrançoisAndrieux jadi benar-benar jawabannya adalah, "Selama API tidak meminta string yang diakhiri null?"
Sailanarmo

Jawaban:

10

Kapan Anda membutuhkan string yang dihentikan nol?

Anda memerlukan string yang dihentikan nol setiap kali API yang Anda gunakan mengatakan bahwa Anda membutuhkannya. Persyaratan ini ada di mana-mana dalam antarmuka C dan tidak secara eksplisit dinyatakan dalam beberapa dokumentasi. Jika argumen fungsi adalah char*(mungkin ke const), dan tidak ada argumen panjang, Anda harus mengasumsikan persyaratan kecuali dokumentasi mengatakan sebaliknya.

Mari kita ambil fungsi execve(dari standar POSIX) sebagai contoh:

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

Jika Anda memberikan argumen terminasi yang bukan nol pathname, maka perilaku program Anda akan tidak ditentukan.

eerorika
sumber
Jadi dalam hal ini, nama path, apakah itu menjadi std::string, akan dieksekusi seperti execve(pathname.c_str(),...,...)?
Sailanarmo
6

Sebenarnya cukup mudah untuk diketahui. Jika Anda memanggil fungsi yang hanya membutuhkan c-string ( char*/ const char*), maka Anda memerlukan string yang diakhiri null karena itu adalah satu-satunya cara untuk mengetahui di mana kemudian ujung string.

Jika Anda sebaliknya memiliki fungsi yang mengambil ukuran a char*/ const char*plus, atau hanya dua pointer menandai awal dan akhir data, maka Anda tidak perlu string diakhiri nol karena Anda memiliki / bisa mendapatkan ukuran string tanpa beralih ke iterasi terminator nol.

NathanOliver
sumber