2009-02-17 30 views
10

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.

+0

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? –

+0

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

Trả lời

18

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()); 
+1

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

+1

@SebiSebi: Cảm ơn vì điều đó, đã được sửa! –

2

Quét chuỗi và xóa tất cả các lần xuất hiện đã tìm thấy.

0

ý 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.

+0

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). –

1

CString thay thế?

thay thế ('\ t', '')

+0

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

+0

Tôi nghĩ anh ấy có nghĩa là "". Dường như làm việc cho tôi. – AndyUK

+0

Cụ thể hơn thay thế ("\ t", "") – AndyUK

6

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()); 
+0

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. –

+0

oops :) vâng, tất nhiên. –

+0

+2 dành cho bạn Konrad! :) –

19

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_offind_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); 
+0

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. –

+0

Bạn nói đúng, tôi đã quên sử dụng thành phần xóa/xóa. Đã sửa. –

+0

+2 cho bạn quá Luc :) –

2

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')); 
+0

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. –

+0

+2 để sửa chữa graham. –

+0

Vâng, đua xe lần đầu tiên có nghĩa là bạn phải viết mã nhanh chóng. –

3

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("")); 
+0

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 , nhưng điều này không xuất hiện trong intellisense. –

+0

@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

0

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; 
} 
+1

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

Các vấn đề liên quan