Расширение ответа Шинга Ипа:
Для удаления не цифр:
#include <iostream>
#include <functional>
#include <string>
#include <algorithm>
using namespace std;
int main() {
string fstring;
getline(cin, fstring);
fstring.erase(
remove_if(fstring.begin(), fstring.end(),
not1(ptr_fun(static_cast<int(*)(int)>(isdigit)))
),
fstring.end()
);
cout << fstring << "\n";
}
Я не уверен, зачем нужен этот static_cast. Я думаю, что что-то неоднозначное в исдигите без этого. [Редактировать: если вы не используете «namespace std», тогда вам это не нужно, поэтому я виноват в том, что ленивый, пишу пример кода.]
Это спорный вопрос, является ли это какой-либо проще, чем прокатки свой собственный цикл:
#include <iostream>
#include <string>
using namespace std;
int main() {
string fstring, ins;
getline(cin, ins);
for (string::iterator it = ins.begin(); it != ins.end(); ++it) {
if (isdigit(*it)) fstring.push_back(*it);
}
cout << fstring << "\n";
}
И C ++ 0x будет иметь copy_if, который был пропущен в основном случайно, и реализовать его тривиально:
#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>
int main() {
std::string fstring, ins;
std::getline(std::cin, ins);
std::copy_if(ins.begin(), ins.end(),
std::back_inserter(fstring), isdigit);
std::cout << fstring << "\n";
}
Чтобы преобразовать в int (или float):
int i = boost::lexical_cast<int>(fstring);
Или, если у вас нет повышения:
#include <sstream>
int i = 0;
std::stringstream(fstring) >> i;
Обратите внимание, что вам нужно инициализировать i, иначе он не будет установлен, если fstring пуст.