Чи міститиме нижченаведений рядок нульовий термінатор '\ 0'?
std::string temp = "hello whats up";
Дякую! :)
Чи міститиме нижченаведений рядок нульовий термінатор '\ 0'?
std::string temp = "hello whats up";
Дякую! :)
Відповіді:
Ні, але якщо ви скажете, що temp.c_str()до повернення від цього методу буде включено нульовий термінатор.
Також варто сказати, що ви можете включити в рядок нульовий символ, як і будь-який інший символ.
string s("hello");
cout << s.size() << ' ';
s[1] = '\0';
cout << s.size() << '\n';
відбитки
5 5
а не так, 5 1як можна було б очікувати, якби нульові символи мали особливе значення для рядків.
temp.c_str()буде включено нульовий символ. Якщо вам це дійсно потрібно у рядку, просто додайте його як будь-який інший символ. temp.push_back('\0'). Тепер temp.c_str()буде включати два нульові символи.
Не в C ++ 03, і навіть не гарантовано до C ++ 11, що в C ++ std :: string є безперервним в пам'яті. Тільки рядки C (масиви символів, призначені для зберігання рядків) мали нульовий термінатор.
У C ++ 11 та пізніших версіях mystring.c_str()еквівалент mystring.data()є еквівалент &mystring[0]і mystring[mystring.size()]гарантовано '\0'.
Це залежить від вашого визначення поняття "містити" тут. В
std::string temp = "hello whats up";
є кілька речей, на які слід звернути увагу:
temp.size()поверне кількість символів від першого hдо останнього p(обидва включно)temp.c_str()або temp.data()повернеться з nullтермінаторомint(temp[temp.size()])буде дорівнювати нулюЯ знаю, я звук , схожий на деякі з відповідей тут , але я хочу відзначити, що sizeз std::stringв C++це підтримується окремо , і це не так, як в , Cде ви зберігаєте підрахунок , якщо ви не знайдете перший nullтермінатор.
Додамо, історія буде дещо іншою, якщо ваш string literalвміст буде вбудованим \0. У цьому випадку побудова std::stringзупинок на першому nullсимволі, як показано нижче:
std::string s1 = "ab\0\0cd"; // s1 contains "ab", using string literal
std::string s2{"ab\0\0cd", 6}; // s2 contains "ab\0\0cd", using different ctr
std::string s3 = "ab\0\0cd"s; // s3 contains "ab\0\0cd", using ""s operator
Список літератури:
Так, якщо ви зателефонуєте temp.c_str(), він поверне нульовий термін c-string.
Однак фактичні дані, що зберігаються в об'єкті, tempможуть не закінчуватися нулем, але це не має значення і не повинно мати значення для програміста, оскільки тоді, коли програміст захоче const char*, він буде викликати c_str()об'єкт, який гарантовано поверне null -кінчена рядок.
temp.size().
std::stringвнутрішньо веде підрахунок кількості символів. Внутрішньо це працює, використовуючи цей підрахунок. Як сказали інші, коли вам потрібен рядок для відображення або з якоїсь іншої причини, ви можете його c_str()метод, який дасть вам рядок із нульовим термінатором в кінці.