मैं इस के लिए लगता है कि मैं का उपयोग करेंगे 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;
}
परिणाम:
Thisisastringwithextrastufftoignore
चूंकि इन अवांछित वर्ण वाले डेटा सामान्य रूप से किसी प्रकार की फ़ाइल से आते हैं, यह भी विचारशील है 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];
}
};
इस का उपयोग करने के लिए, आप एक स्थान इस पहलू का उपयोग कर के साथ इनपुट धारा रंगना, और उसके बाद सामान्य रूप से पढ़ें। चूंकि आप एक स्ट्रिंग के बारे में बात कर रहे हैं
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;
}
स्रोत
2010-08-20 14:01:49
, मैं कर रहा हूँ वाला मान लें कि आपके सी मतलब ++, और यह फिर से टैग देगा: क्षण के लिए मैं एक
istringstream
इस्तेमाल करेंगे, हालांकि आप सामान्य रूप से एकistream
याifstream
की तरह कुछ का उपयोग करेंगे जैसे की। – Jamesएक स्ट्रिंग का मतलब सी में भी वही बात है। –
@ जेम्स: मुझे सच में नहीं लगता कि आप यह धारणा कर सकते हैं। – Vicky