Я играл с std::string_view
библиотекой и обдумывал изменение кодовой базы, над которой я работал, чтобы использовать std::string_view
как можно больше. Тем не менее, во многих темах, которые я прочитал на тему, когда и где использовать std::string_view
вместо const std::string &
. Я видел много ответов: «Когда вам не нужна строка с нулевым символом в конце». Поэтому, когда я начал искать в Интернете, "когда вам нужна строка с нулевым символом в конце?" Я действительно не сталкивался ни с какими полезными ответами на предмет.
Я могу вспомнить пример внешней библиотеки, на которую вы будете ссылаться, которая требует std::string
. И в этом случае вам понадобится строка с нулевым символом в конце, поскольку эта библиотека требует этого. Я предполагаю, что другим примером может быть, если вам нужно изменить саму строку, но тогда мы не пропустим ее, const &
если нам потребуется ее изменить.
Так когда же вам нужно использовать строку с нулевым символом в конце?
Ссылки, которые я посмотрел:
источник
const char*
аргументы. У Эверики есть ответ.Ответы:
Вам нужна строка с нулевым символом в конце, когда используемый вами API говорит, что он вам нужен. Это требование вездесуще в интерфейсах C и явно не указано в какой-либо документации. Если аргументом функции является
char*
(возможно, const), а аргумент длины отсутствует, вы должны принять это требование, если в документации не указано иное.Давайте возьмем функцию
execve
(из стандарта POSIX) в качестве примера:Если вы передадите аргумент с ненулевым символом в качестве as
pathname
, поведение вашей программы будет неопределенным.источник
std::string
, будет выполнено какexecve(pathname.c_str(),...,...)
?Это на самом деле довольно легко узнать. Если вы вызываете функцию, которая просто принимает c-строку (
char*
/const char*
), то вам нужна строка с нулевым символом в конце, так как это единственный способ узнать, где находится конец строки.Если вместо этого у вас есть функция, которая принимает
char*
/const char*
плюс размер или только два указателя, отмечающие начало и конец данных, то вам не нужна строка с нулевым символом в конце, поскольку вы можете / можете получить размер строки без итерации до нулевой терминатор.источник