Чи міститиме нижченаведений рядок нульовий термінатор '\ 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()
метод, який дасть вам рядок із нульовим термінатором в кінці.