Làm cách nào để xóa ký tự cuối cùng khỏi chuỗi C ++?
Tôi đã thử st = substr(st.length()-1);
Nhưng nó không hoạt động.
CString str=CString("Hello world"); str.Delete(str.GetLength()-1);
Làm cách nào để xóa ký tự cuối cùng khỏi chuỗi C ++?
Tôi đã thử st = substr(st.length()-1);
Nhưng nó không hoạt động.
CString str=CString("Hello world"); str.Delete(str.GetLength()-1);
Câu trả lời:
Đối với phiên bản không biến đổi:
st = myString.substr(0, myString.size()-1);
st = st.substr(0, st.size()-1)
. Nhưng nó vẫn không nhìn đúng cách, tôi nghĩ rằng cách thích hợp là sử dụng hàm dành cho nhiệm vụ này, nó được gọi là erase () và mã là : st.erase(st.size()-1)
. Đây sẽ được gọi là "phiên bản đột biến".
pop_back
không tồn tại trong C ++ 03) và đó cũng là một sửa đổi tại chỗ (và OP không bao giờ làm rõ liệu anh ấy có muốn tại chỗ hay không) ... như như vậy, anh ta có một câu trả lời đúng, nhưng không phải là câu trả lời duy nhất có thể.
Giải pháp đơn giản nếu bạn đang sử dụng C ++ 11. Có lẽ là thời gian O (1):
st.pop_back();
if (str.size () > 0) str.resize (str.size () - 1);
Một thay thế std :: erase là tốt, nhưng tôi thích "- 1" (cho dù dựa trên kích thước hoặc bộ lặp cuối) - với tôi, nó giúp thể hiện ý định.
BTW - Có thực sự không có std :: string :: pop_back? - Có vẻ lạ.
std::string::pop_back
trong C ++ 03; mặc dù nó đã được thêm vào C ++ 0x.
resize
là một chức năng thay đổi kích thước và không còn là chức năng bộ nhớ mà bất cứ điều gì khác có thể làm tăng bộ nhớ cần thiết. Ví dụ: nếu bạn resize
ở kích thước nhỏ hơn, nó sẽ không làm giảm bộ nhớ dành riêng. Tôi nghĩ rằng bạn đang nghĩ đến reserve
, điều này ít nhất có thể làm giảm bộ nhớ được phân bổ nếu được yêu cầu - xem thay đổi kích thước ở đây và dự trữ ở đây .
buf.erase(buf.size() - 1);
Điều này giả định rằng bạn biết rằng chuỗi không trống. Nếu vậy, bạn sẽ có một out_of_range
ngoại lệ.
size()
thay vì end()
một câu trả lời khác?
str.erase( str.end()-1 )
Tham khảo: std :: string :: erase () nguyên mẫu 2
không cần c ++ 11 hoặc c ++ 0x.
string s("abc");
, sau khi xóa, nó có vẻ hoạt động: cout<<s; // prints "ab"
tuy nhiên, ký tự cuối cùng vẫn ở đó : cout<<s[2]; // still prints 'c'
.
str[str.length()-1] = 0; str.erase(str.end()-1);
s[2]
là bất hợp pháp.
Với C ++ 11, bạn thậm chí không cần chiều dài / kích thước. Miễn là chuỗi không trống, bạn có thể làm như sau:
if (!st.empty())
st.erase(std::prev(st.end())); // Erase element referred to by iterator one
// before the end
str.erase(str.begin() + str.size() - 1)
str.erase(str.rbegin())
không may biên dịch, vì reverse_iterator
không thể chuyển đổi thành normal_iterator.
C ++ 11 là bạn của bạn trong trường hợp này.
str.erase(str.end() - 1)
?
Nếu độ dài khác không, bạn cũng có thể
str[str.length() - 1] = '\0';
\0
không thay đổi độ dài của chuỗi. str.length()
sẽ không chính xác.