Chuỗi bên dưới có chứa dấu chấm dứt rỗng '\ 0' không?
std::string temp = "hello whats up";
Cảm ơn! :)
Chuỗi bên dưới có chứa dấu chấm dứt rỗng '\ 0' không?
std::string temp = "hello whats up";
Cảm ơn! :)
Câu trả lời:
Không, nhưng nếu bạn nói temp.c_str()
một dấu chấm hết rỗng sẽ được bao gồm trong trả về từ phương thức này.
Cũng cần nói rằng bạn có thể bao gồm một ký tự null trong một chuỗi giống như bất kỳ ký tự nào khác.
string s("hello");
cout << s.size() << ' ';
s[1] = '\0';
cout << s.size() << '\n';
bản in
5 5
và không 5 1
như bạn mong đợi nếu các ký tự null có ý nghĩa đặc biệt đối với chuỗi.
temp.c_str()
ký tự null sẽ được bao gồm. Nếu bạn thực sự cần nó trong chuỗi, chỉ cần thêm nó giống như bất kỳ ký tự nào khác. temp.push_back('\0')
. Bây giờ temp.c_str()
sẽ bao gồm hai ký tự rỗng.
Không có trong C ++ 03 và thậm chí không được đảm bảo trước C ++ 11 rằng trong C ++ std :: chuỗi là liên tục trong bộ nhớ. Chỉ có chuỗi C (mảng ký tự được dùng để lưu trữ chuỗi) có dấu chấm hết là null.
Trong C ++ 11 trở lên, mystring.c_str()
tương đương với mystring.data()
tương đương với &mystring[0]
và mystring[mystring.size()]
được đảm bảo là như vậy '\0'
.
Điều này phụ thuộc vào định nghĩa của bạn về 'chứa' ở đây. Trong
std::string temp = "hello whats up";
có một số điều cần lưu ý:
temp.size()
sẽ trả về số ký tự từ đầu tiên h
đến cuối cùng p
(bao gồm cả hai)temp.c_str()
hoặc temp.data()
sẽ trở lại với một dấu null
chấm hếtint(temp[temp.size()])
sẽ là số khôngTôi biết, tôi âm thanh tương tự như một số các câu trả lời ở đây nhưng tôi muốn chỉ ra rằng size
các std::string
tại C++
được duy trì một cách riêng biệt và nó không phải là như trong C
nơi bạn giữ đếm trừ khi bạn tìm ra đầu tiên null
terminator.
Nói thêm, câu chuyện sẽ khác một chút nếu nội dung của bạn string literal
được nhúng \0
. Trong trường hợp này, việc xây dựng các std::string
điểm dừng ở null
ký tự đầu tiên , như sau:
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
Người giới thiệu:
Có nếu bạn gọi temp.c_str()
, thì nó sẽ trả về chuỗi c-kết thúc bằng null.
Tuy nhiên, dữ liệu thực tế được lưu trữ trong đối tượng temp
có thể không bị kết thúc bằng null, nhưng điều đó không quan trọng và không quan trọng đối với lập trình viên, bởi vì khi lập trình viên muốn const char*
, anh ta sẽ gọi c_str()
đối tượng, được đảm bảo trả về null -mã kết thúc.
temp.size()
.
Với chuỗi C ++, bạn không phải lo lắng về điều đó và nó có thể phụ thuộc vào việc triển khai.
Khi sử dụng, temp.c_str()
bạn sẽ có được một biểu diễn C của chuỗi, chắc chắn sẽ chứa ký tự \0
char. Ngoài ra, tôi không thực sự thấy nó sẽ hữu ích như thế nào trên một chuỗi C ++
std::string
bên trong giữ một số lượng ký tự. Nội bộ nó hoạt động bằng cách sử dụng số lượng này. Giống như những người khác đã nói, khi bạn cần chuỗi để hiển thị hoặc bất cứ lý do gì, bạn có thể thực hiện c_str()
phương thức của nó để cung cấp cho bạn chuỗi với dấu chấm dứt null ở cuối.