Khi nào bạn cần một chuỗi kết thúc null trong kịch bản chỉ đọc?


10

Tôi đã chơi xung quanh với std::string_viewthư viện và tôi đã suy nghĩ về việc thay đổi một cơ sở mã mà tôi đang làm việc để sử dụng std::string_viewcàng nhiều càng tốt. Tuy nhiên, trong nhiều chủ đề mà tôi đã đọc về chủ đề khi nào và ở đâu sử dụng std::string_viewthay vì const std::string &. Tôi đã thấy nhiều câu trả lời rằng: "Khi bạn không cần một chuỗi kết thúc null." Vì vậy, khi tôi bắt đầu tìm kiếm trên web, "khi nào bạn cần một chuỗi kết thúc null?" Tôi chưa thực sự bắt gặp bất kỳ câu trả lời hữu ích nào về chủ đề này.

Tôi có thể nghĩ về một ví dụ về một thư viện bên ngoài mà bạn sẽ liên kết đến đó yêu cầu a std::string. Và trong trường hợp đó, bạn sẽ cần một chuỗi kết thúc null vì thư viện đó yêu cầu nó. Tôi đoán một ví dụ khác sẽ là nếu bạn cần sửa đổi chính chuỗi đó, nhưng sau đó chúng tôi sẽ không vượt qua nó const &nếu chúng tôi cần sửa đổi nó.

Vì vậy, khi nào bạn cần sử dụng một chuỗi kết thúc null?

Liên kết mà tôi đã xem:

  1. Làm thế nào chính xác là std :: string_view nhanh hơn const std :: string &?
  2. Khi nào tôi sẽ vượt qua const & std :: string thay vì std :: string_view?
  3. Tại sao chỉ xem chuỗi?
  4. Có ý nghĩa gì trong việc sử dụng const std :: string & argument trong C ++ 17 không?

5
Để giao diện với API C, chủ yếu.
quả óc chó

@uneven_mark bạn có thể cung cấp một ví dụ về một?
Sailanarmo

Câu trả lời được chấp nhận cho câu hỏi thứ tư mà bạn liên kết có vẻ như nó trả lời câu hỏi này.
François Andrieux

1
@Sailanarmo Hầu hết các chức năng từ ví dụ POSIX hoặc bất kỳ thư viện C nào khác đang const char*tranh luận. Anwer của eerorika có một ví dụ.
quả óc chó

1
@ FrançoisAndrieux vì vậy thực sự câu trả lời là "Chừng nào API không yêu cầu một chuỗi kết thúc null?"
Sailanarmo

Câu trả lời:


10

Khi nào bạn cần một chuỗi kết thúc null?

Bạn cần một chuỗi kết thúc null bất cứ khi nào API mà bạn sử dụng nói rằng bạn cần nó. Yêu cầu này có mặt khắp nơi trong các giao diện C và không được nêu rõ ràng trong một số tài liệu. Nếu một đối số hàm là một char*(có thể là const) và không có đối số độ dài, bạn nên thừa nhận yêu cầu trừ khi tài liệu nói khác đi.

Hãy lấy chức năng execve(từ tiêu chuẩn POSIX) làm ví dụ:

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

Nếu bạn vượt qua một đối số kết thúc không null pathname, thì hành vi của chương trình của bạn sẽ không được xác định.


Vì vậy, trong trường hợp này, tên đường dẫn, có phải là một std::string, sẽ được thực thi như thế execve(pathname.c_str(),...,...)nào?
Sailanarmo

6

Nó thực sự khá dễ để biết. Nếu bạn đang gọi một hàm chỉ cần một chuỗi c ( char*/const char* ), thì bạn cần một chuỗi kết thúc null vì đó là cách duy nhất để biết đầu chuỗi ở đâu.

Thay vào đó, nếu bạn có một hàm lấy char*/ const char*cộng kích thước hoặc chỉ hai con trỏ đánh dấu điểm bắt đầu và kết thúc của dữ liệu, thì bạn không cần một chuỗi kết thúc null vì bạn có / có thể lấy kích thước chuỗi mà không lặp lại kẻ hủy diệt null.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.