Akankah string di bawah ini berisi terminator nol '\ 0'?
std::string temp = "hello whats up";
Terima kasih! :)
Akankah string di bawah ini berisi terminator nol '\ 0'?
std::string temp = "hello whats up";
Terima kasih! :)
Jawaban:
Tidak, tetapi jika Anda mengatakan temp.c_str()terminator null akan dimasukkan dalam pengembalian dari metode ini.
Perlu juga dikatakan bahwa Anda dapat menyertakan karakter nol dalam string seperti karakter lainnya.
string s("hello");
cout << s.size() << ' ';
s[1] = '\0';
cout << s.size() << '\n';
cetakan
5 5
dan tidak 5 1seperti yang Anda harapkan jika karakter nol memiliki arti khusus untuk string.
temp.c_str()karakter null akan dimasukkan. Jika Anda benar-benar membutuhkannya dalam string, tambahkan saja seperti karakter lainnya. temp.push_back('\0'). Sekarang temp.c_str()akan menyertakan dua karakter nol.
Tidak dalam C ++ 03, dan bahkan tidak dijamin sebelum C ++ 11 bahwa dalam C ++ std :: string kontinu dalam memori. Hanya string C (array karakter yang dimaksudkan untuk menyimpan string) yang memiliki terminator null.
Di C ++ 11 dan yang lebih baru, mystring.c_str()ekuivalen dengan mystring.data()ekuivalen dengan &mystring[0], dan mystring[mystring.size()]dijamin akan menjadi '\0'.
Ini tergantung pada definisi Anda tentang 'berisi' di sini. Di
std::string temp = "hello whats up";
ada beberapa hal yang perlu diperhatikan:
temp.size()akan mengembalikan jumlah karakter dari awal hhingga akhirp (keduanya inklusif)temp.c_str()atau temp.data()akan kembali dengan anull terminatorint(temp[temp.size()])akan menjadi nolAku tahu, aku terdengar mirip dengan beberapa jawaban di sini tapi aku ingin menunjukkan bahwa sizedari std::stringdalam C++adalah secara terpisah dan tidak seperti di Cmana Anda menyimpan penghitungan kecuali jika Anda menemukan pertamanull terminator.
Sebagai tambahan, ceritanya akan sedikit berbeda jika konten Anda string literaldisematkan \0. Dalam hal ini, pembangunan std::stringberhenti pada nullkarakter pertama , sebagai berikut:
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
Referensi:
Ya jika Anda menelepon temp.c_str() , maka itu akan mengembalikan c-string yang diakhiri null.
Namun, data aktual yang disimpan dalam objek tempmungkin tidak null-terminated, tetapi itu tidak masalah dan seharusnya tidak masalah bagi programmer, karena ketika programmer menginginkannya const char*, dia akan memanggil c_str()objek tersebut, yang dijamin akan mengembalikan null string -terminated.
temp.size().
Dengan string C ++ Anda tidak perlu khawatir tentang itu, dan ini mungkin bergantung pada implementasinya.
Menggunakan temp.c_str()Anda mendapatkan representasi C dari string, yang pasti akan berisi \0karakter. Selain itu, saya tidak benar-benar melihat bagaimana itu akan berguna pada string C ++
std::stringsecara internal menghitung jumlah karakter. Secara internal, ini berfungsi menggunakan hitungan ini. Seperti yang dikatakan orang lain, ketika Anda membutuhkan string untuk tampilan atau alasan apa pun, Anda dapat c_str()metode yang akan memberi Anda string dengan terminator nol di bagian akhir.