Có ai có thể đề xuất cách xóa các ký tự tab ("\ t" s) khỏi chuỗi không? CString hoặc std :: string.Cắt/xóa tab (" t") khỏi chuỗi
Vì vậy mà "1e10 " ví dụ trở thành "1e10".
Cảm ơn bạn đã dự đoán.
Có ai có thể đề xuất cách xóa các ký tự tab ("\ t" s) khỏi chuỗi không? CString hoặc std :: string.Cắt/xóa tab (" t") khỏi chuỗi
Vì vậy mà "1e10 " ví dụ trở thành "1e10".
Cảm ơn bạn đã dự đoán.
hackingwords' answer giúp bạn nửa chừng ở đó. Nhưng std::remove()
từ <algorithm>
không thực sự làm cho chuỗi ngắn hơn - nó chỉ trả về một trình lặp cho biết "chuỗi mới sẽ kết thúc tại đây". Bạn cần gọi số my_string().erase()
để thực hiện việc đó:
#include <string>
#include <algorithm> // For std::remove()
my_str.erase(std::remove(my_str.begin(), my_str.end(), '\t'), my_str.end());
std :: remove() liên kết bị hỏng. Liên kết chính xác: http://en.cppreference.com/w/cpp/algorithm/remove – SebiSebi
@SebiSebi: Cảm ơn vì điều đó, đã được sửa! –
Quét chuỗi và xóa tất cả các lần xuất hiện đã tìm thấy.
ý tưởng đầu tiên sẽ được sử dụng remove
remove(myString.begin(), myString.end(), "\t");
Mặc dù bạn có thể phải sử dụng remove_if thay vì nếu so sánh mà không hoạt động.
remove() là một nửa số đó - bạn cũng cần phải kết thúc cuộc gọi đó để remove() bằng một cuộc gọi đến myString.erase(), vì remove() không thực sự rút ngắn chuỗi (nó không (và có thể 't) biết làm thế nào). –
CString thay thế?
thay thế ('\ t', '')
Sẽ không hoạt động. '' là viết tắt của ký tự NULL (ít nhất là trong VC++). Sẽ gây ra vấn đề. – sharptooth
Tôi nghĩ anh ấy có nghĩa là "". Dường như làm việc cho tôi. – AndyUK
Cụ thể hơn thay thế ("\ t", "") – AndyUK
Thuật toán remove
chuyển tất cả các nhân vật không bị xóa để bắt đầu, ghi đè lên các nhân vật bị xóa nhưng nó không thay đổi chiều dài của container (kể từ nó hoạt động trên các trình vòng lặp và không biết vùng chứa bên dưới). Để đạt được điều này, hãy gọi erase
:
str.erase(remove(str.begin(), str.end(), '\t'), str.end());
Tôi nghĩ rằng bạn có các tham số để xóa() trộn lên. Bạn muốn xóa * từ * trình vòng lặp được trả về bởi remove() đến * end * của str. –
oops :) vâng, tất nhiên. –
+2 dành cho bạn Konrad! :) –
Nếu bạn muốn loại bỏ tất cả các lần xuất hiện trong chuỗi, sau đó bạn có thể sử dụng erase/remove thành ngữ:
#include <algorithm>
s.erase(std::remove(s.begin(), s.end(), '\t'), s.end());
Nếu bạn muốn loại bỏ chỉ tab ở bắt đầu và kết thúc của chuỗi, bạn có thể sử dụng boost string algorithms:
#include <boost/algorithm/string.hpp>
boost::trim(s); // removes all leading and trailing white spaces
boost::trim_if(s, boost::is_any_of("\t")); // removes only tabs
Nếu sử dụng Boost là quá nhiều chi phí, bạn có thể cuộn riêng chức năng cắt USI của bạn ng find_first_not_of
và find_last_not_of
phương pháp chuỗi.
std::string::size_type begin = s.find_first_not_of("\t");
std::string::size_type end = s.find_last_not_of("\t");
std::string trimmed = s.substr(begin, end-begin + 1);
std :: remove() không làm cho chuỗi ngắn hơn - nó chỉ trả về một trình lặp cho biết "chuỗi mới kết thúc ở đây". Bạn cần gọi s.erase() sau đó với trình vòng lặp đó để thực sự rút ngắn chuỗi. –
Bạn nói đúng, tôi đã quên sử dụng thành phần xóa/xóa. Đã sửa. –
+2 cho bạn quá Luc :) –
HackingWords đang ở gần đó: Sử dụng xóa kết hợp với xóa.
std::string my_string = "this\tis\ta\ttabbed\tstring";
my_string.erase(std::remove(my_string.begin(), my_string.end(), my_string.end(), '\t'));
Tôi nghĩ rằng bạn đã phạm sai lầm tương tự như Konrad Rudolph - bạn cần phải xóa * từ * trình lặp được trả về bởi std :: remove() thành * end * của chuỗi. –
+2 để sửa chữa graham. –
Vâng, đua xe lần đầu tiên có nghĩa là bạn phải viết mã nhanh chóng. –
Kể từ khi những người khác đã trả lời làm thế nào để làm điều này với std :: string, đây là những gì bạn có thể sử dụng cho CString:
myString.TrimRight('\t'); // trims tabs from end of string
myString.Trim('\t'); // trims tabs from beginning and end of string
nếu bạn muốn thoát khỏi tất cả các tab, ngay cả những người bên trong chuỗi, sử dụng
myString.Replace(_T("\t"), _T(""));
Tiêu đề/thư viện nào để đưa vào sử dụng phương pháp TrimRight và Trim trên chuỗi? Tôi đã thực hiện #include
@FarazAhmad CString Stefan sử dụng là một lớp của riêng nó. Đó là từ tiêu đề afx.h. Bạn có thể sử dụng nó bằng cách liên kết với MS thư viện thời gian chạy phổ biến trong cửa sổ. – nurettin
tôi tự hỏi tại sao không có ai Trims một chuỗi theo cách này:
void trim (string& s) {
string t = "";
int i = 0;
while(s[i] == ' ') i++;
while(s[i] == '\t') i++;
for(i; i < s.length(); i++)
t += s[i];
s = t;
}
Bởi vì nó sẽ không xử lý đúng tất cả các trường hợp. Nó sẽ chỉ bỏ qua không gian hàng đầu, sau đó là các tab dẫn đầu và chỉ theo thứ tự này. – rubikonx9
Bạn có nghĩa là chỉ từ đầu hoặc cuối? Hoặc từ bất cứ nơi nào trong chuỗi? Nên "abc \ tdef" được giữ nguyên hoặc bị giảm xuống "abcdef" không? –
Tôi cần phải rõ ràng hơn về điều này, tôi có nghĩa là từ bất cứ nơi nào trong chuỗi. – AndyUK