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 1
seperti 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 h
hingga 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 size
dari std::string
dalam C++
adalah secara terpisah dan tidak seperti di C
mana Anda menyimpan penghitungan kecuali jika Anda menemukan pertamanull
terminator.
Sebagai tambahan, ceritanya akan sedikit berbeda jika konten Anda string literal
disematkan \0
. Dalam hal ini, pembangunan std::string
berhenti pada null
karakter 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 temp
mungkin 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 \0
karakter. Selain itu, saya tidak benar-benar melihat bagaimana itu akan berguna pada string C ++
std::string
secara 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.