Коли вам потрібен нульовий завершений рядок у сценарії лише для читання?


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 та аргументи в C ++ 17?

5
В основному для взаємодії з API API.
волоський горіх

@uneven_mark Ви можете навести приклад?
Sailanarmo

Прийнята відповідь на четверте питання, на яке ви посилаєтесь, здається, відповідає на це запитання.
Франсуа

1
@Sailanarmo Більшість функцій, наприклад, POSIX або будь-якої іншої бібліотеки C, яка бере const char*аргумент. Приклад eerorika є прикладом.
волоський горіх

1
@ FrançoisAndrieux так дійсно відповідає: "Поки API не закликає нульову завершену рядок?"
Сайланармо

Відповіді:


10

Коли вам потрібна нульова завершена рядок?

Вам потрібна нульова завершена рядок, коли API, який ви використовуєте, говорить, що вам це потрібно. Ця вимога є всюдисущою в інтерфейсах C і не чітко зазначена в деяких документах. Якщо аргумент функції - це char*(можливо, const), і немає аргументу довжини, слід взяти на себе вимогу, якщо в документації не вказано інше.

Візьмемо execveдля прикладу функцію (зі стандарту POSIX):

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

Якщо ви передасте ненульовий аргумент як pathname, тоді поведінка вашої програми буде не визначеною.


Отже, у цьому випадку ім'я контуру, як би це std::stringбуло, буде виконуватися як execve(pathname.c_str(),...,...)?
Sailanarmo

6

Це насправді досить легко дізнатися. Якщо ви викликаєте функцію, яка просто займає c-string ( char*/ const char*), то вам потрібна нульова завершена рядок, оскільки це єдиний спосіб дізнатися, де тоді кінець рядка.

Якщо натомість у вас є функція, яка має розмір char*/ const char*плюс, або лише два вказівники, що позначають початок і кінець даних, то вам не потрібна нульова завершена рядок, оскільки ви маєте / можете отримати розмір рядка без ітерації нульовий термінатор.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.