Когда вам нужна строка с нулевым окончанием в сценарии только для чтения?

10

Я играл с std::string_viewбиблиотекой и обдумывал изменение кодовой базы, над которой я работал, чтобы использовать std::string_viewкак можно больше. Тем не менее, во многих темах, которые я прочитал на тему, когда и где использовать std::string_viewвместо const std::string &. Я видел много ответов: «Когда вам не нужна строка с нулевым символом в конце». Поэтому, когда я начал искать в Интернете, "когда вам нужна строка с нулевым символом в конце?" Я действительно не сталкивался ни с какими полезными ответами на предмет.

Я могу вспомнить пример внешней библиотеки, на которую вы будете ссылаться, которая требует std::string. И в этом случае вам понадобится строка с нулевым символом в конце, поскольку эта библиотека требует этого. Я предполагаю, что другим примером может быть, если вам нужно изменить саму строку, но тогда мы не пропустим ее, const &если нам потребуется ее изменить.

Так когда же вам нужно использовать строку с нулевым символом в конце?

Ссылки, которые я посмотрел:

  1. Как именно std :: string_view быстрее, чем const std :: string &?
  2. Когда я передам const & std :: string вместо std :: string_view?
  3. Почему только строковое представление?
  4. Есть ли смысл использовать const std :: string & arguments в C ++ 17?
Sailanarmo
источник
5
Для взаимодействия с C API, в основном.
грецкий орех
@uneven_mark Можете ли вы привести пример одного?
Сайланармо
Принятый ответ на четвертый вопрос, на который вы ссылаетесь, похоже, отвечает на этот вопрос.
Франсуа Андриё
1
@Sailanarmo Большинство функций, например, из POSIX или любой другой библиотеки C, принимают const char*аргументы. У Эверики есть ответ.
грецкий орех
1
@ FrançoisAndrieux, поэтому на самом деле ответ таков: «До тех пор, пока API не вызывает пустую завершенную строку?»
Сайланармо

Ответы:

10

Когда вам нужна строка с нулевым символом в конце?

Вам нужна строка с нулевым символом в конце, когда используемый вами API говорит, что он вам нужен. Это требование вездесуще в интерфейсах C и явно не указано в какой-либо документации. Если аргументом функции является char*(возможно, const), а аргумент длины отсутствует, вы должны принять это требование, если в документации не указано иное.

Давайте возьмем функцию execve(из стандарта POSIX) в качестве примера:

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

Если вы передадите аргумент с ненулевым символом в качестве as pathname, поведение вашей программы будет неопределенным.

eerorika
источник
Так что в этом случае имя пути, должно быть std::string, будет выполнено как execve(pathname.c_str(),...,...)?
Сайланармо
6

Это на самом деле довольно легко узнать. Если вы вызываете функцию, которая просто принимает c-строку ( char*/ const char*), то вам нужна строка с нулевым символом в конце, так как это единственный способ узнать, где находится конец строки.

Если вместо этого у вас есть функция, которая принимает char*/ const char*плюс размер или только два указателя, отмечающие начало и конец данных, то вам не нужна строка с нулевым символом в конце, поскольку вы можете / можете получить размер строки без итерации до нулевой терминатор.

NathanOliver
источник