#include <iostream>
#include <string>
using namespace std;
class Nnumber : std::unary_function<char, bool>{
static int k;
public:
bool operator ()(char ch) {
if (isdigit(ch))
return false;
if ( ch == ',' || ch == '.') {
++k;
if(k < 2)
return false;
else
return true;
}
return true;
}
};
int Nnumber::k = 0;
void remake(string& s) {
s.erase(remove_if(s.begin(), s.end(), Nnumber()), s.end());
}
int main(int argc, char *argv[])
{
QCoreApplication qca(argc, argv);
string s("123, rt45,6j"), s1("567,.. 87");
remake(s);
remake(s1);
cout << s <<'\n' // "123,457"
<< s1; // "56787" ??? нет символа ','
return qca.exec();
}
Мне нужно чтобы строка представляла рациональное число произвольной длины, а для этого пытаюсь исключать любой попавший там ненужный символ. Я ожидал, что s1 == "567,87", однако это не так. Никак не разобрался в чем ошибка. Помогите пожалуйста исправить
Логично, потому что k - у Вас статическая переменная, и между разными вызовами ее значение сохраняется. Не забывайте её обнулять и все будет ок.
P.S.
код вида
if(k < 2)
return false;
else
return true;
лучше заменить на
return (k>=2);
?
#include <iostream>
#include <string>
using namespace std;
class Nnumber : std::unary_function<char, bool>{
public:
Nnumber(): k(0) {}
bool operator ()(char ch) {
if (isdigit(ch))
return false;
if ( ch == ',' || ch == '.') {
++k;
if(k < 2)
return false;
else
return true;
}
return true;
}
};
void remake(string& s) {
s.erase(remove_if(s.begin(), s.end(), Nnumber()), s.end());
}
int main(int argc, char *argv[])
{
QCoreApplication qca(argc, argv);
string s("123, rt45,6j"), s1("567,.. 87");
remake(s);
remake(s1);
cout << s <<'\n' // "123,457"
<< s1; // "56787" ??? нет символа ','
return qca.exec();
}
struct Nnumber : std::unary_function<char, bool>{
static int k;
bool operator ()(char ch) {
if (isdigit(ch))
return false;
if ( ch == ',' || ch == '.') {
++k;
return k >= 2;
}
return true;
}
};
int Nnumber::k = 0;
void remake(string& s) {
s.erase(remove_if(s.begin(), s.end(), Nnumber()), s.end());
Nnumber::k = 0;
}
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости