логическая ошибка в операторе функтора

171
17 февраля 2018, 22:45
#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", однако это не так. Никак не разобрался в чем ошибка. Помогите пожалуйста исправить

Answer 1

Логично, потому что k - у Вас статическая переменная, и между разными вызовами ее значение сохраняется. Не забывайте её обнулять и все будет ок.

P.S.

код вида

if(k < 2)
  return false;
else
  return true;

лучше заменить на

return (k>=2);
Answer 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();
}
Answer 3
  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;
}
READ ALSO
Создать Java Обновление программы

Создать Java Обновление программы

Всем приветСкажите пожалуйста как сделать обновление программы JavaFX desktop? Делать обновления с Ftp

228
Maven подключение конфигурационных файлов для Spring

Maven подключение конфигурационных файлов для Spring

Привет на данный момент структура моего проекта выглядит так

217
Обновление приложения через Push button

Обновление приложения через Push button

Во многих приложениях есть такая функция в меню,когда телефон подключен к интернету,вместе с основными кнопками,допустим в каком нибудь...

198
Проблема с аудифокусом в приложении (AudioManager.AUDIOFOCUS_GAIN)

Проблема с аудифокусом в приложении (AudioManager.AUDIOFOCUS_GAIN)

Ситуация заключается в том, что в приложении исправно работает только один режим, при котором если поступает звонок, музыка прекращает игратьПри...

248