Tôi nghĩ cho điều này tôi muốn sử dụng std::remove_copy_if
:
#include <string>
#include <algorithm>
#include <iostream>
struct bad_char {
bool operator()(char ch) {
return ch == '@' || ch == '#' || ch == '$' || ch == '%';
}
};
int main() {
std::string in("[email protected]#a$string%[email protected]#stuff$to%ignore");
std::string out;
std::remove_copy_if(in.begin(), in.end(), std::back_inserter(out), bad_char());
std::cout << out << "\n";
return 0;
}
Kết quả:
Thisisastringwithextrastufftoignore
Vì dữ liệu chứa các ký tự không mong muốn này thường sẽ xuất phát từ một tệp nào đó, nó cũng đáng xem xét ng loại bỏ chúng khi bạn đọc dữ liệu từ tệp thay vì đọc dữ liệu không mong muốn thành chuỗi và sau đó lọc lọc. Để làm điều này, bạn có thể tạo ra một khía cạnh mà phân loại các ký tự không mong muốn là khoảng trắng:
struct filter: std::ctype<char>
{
filter(): std::ctype<char>(get_table()) {}
static std::ctype_base::mask const* get_table()
{
static std::vector<std::ctype_base::mask>
rc(std::ctype<char>::table_size,std::ctype_base::mask());
rc['@'] = std::ctype_base::space;
rc['#'] = std::ctype_base::space;
rc['$'] = std::ctype_base::space;
rc['%'] = std::ctype_base::space;
return &rc[0];
}
};
Để sử dụng, bạn thấm nhuần dòng đầu vào với một miền địa phương sử dụng khía cạnh này, và sau đó đọc bình thường. Đối với thời điểm này tôi sẽ sử dụng một istringstream
, mặc dù bạn thường muốn sử dụng một cái gì đó giống như một istream
hoặc ifstream
:
int main() {
std::istringstream in("[email protected]#a$string%[email protected]#stuff$to%ignore");
in.imbue(std::locale(std::locale(), new filter));
std::copy(std::istream_iterator<char>(in),
std::istream_iterator<char>(),
std::ostream_iterator<char>(std::cout));
return 0;
}
Nguồn
2010-08-20 14:01:49
Vì bạn đang nói về một chuỗi, tôi sẽ giả sử bạn có nghĩa là C++, và sẽ gắn lại thẻ cho nó như vậy. – James
Một chuỗi có nghĩa là cùng một điều trong C là tốt. –
@ James: Tôi thực sự không nghĩ rằng bạn có thể đưa ra giả định đó. – Vicky