Проблемы при написании спецификации clojure для схемы

Вы можете проверить это следующим образом:

int x;
cin >> x;

if (cin.fail()) {
    //Not an int.
}

Кроме того, вы можете продолжать вводить ввод, пока не получите int через:

#include <iostream>



int main() {

    int x;
    std::cin >> x;
    while(std::cin.fail()) {
        std::cout << "Error" << std::endl;
        std::cin.clear();
        std::cin.ignore(256,'\n');
        std::cin >> x;
    }
    std::cout << x << std::endl;

    return 0;
}

EDIT: Чтобы отправить комментарий ниже относительно ввода типа 10abc, можно было бы изменить цикл, чтобы принять строку в качестве входа. Затем проверьте строку для любого символа, а не числа, и соответствующим образом обработайте эту ситуацию. В этой ситуации не нужно очищать / игнорировать входной поток. Проверка строки - это просто цифры, преобразование строки обратно в целое. Я имею в виду, это было как раз от манжеты. Возможно, лучший способ. Это не сработает, если вы принимаете float / doubles (нужно добавить «.» В строку поиска).

#include <iostream>
#include <string>

int main() {

    std::string theInput;
    int inputAsInt;

    std::getline(std::cin, theInput);

    while(std::cin.fail() || std::cin.eof() || theInput.find_first_not_of("0123456789") != std::string::npos) {

        std::cout << "Error" << std::endl;

        if( theInput.find_first_not_of("0123456789") == std::string::npos) {
            std::cin.clear();
            std::cin.ignore(256,'\n');
        }

        std::getline(std::cin, theInput);
    }

    std::string::size_type st;
    inputAsInt = std::stoi(theInput,&st);
    std::cout << inputAsInt << std::endl;
    return 0;
}
1
задан Faiz Halde 22 February 2019 в 15:20
поделиться

1 ответ

Вы можете указать собственный генератор, например так:

(require '[clojure.test.check.generators :as gen])

(gen/let [active? gen/boolean
          metric (if active? (s/gen int?) (gen/return 0))]
  {:active? active? :metric metric})

(gen/sample *1)
({:active? true, :metric 0} {:active? true, :metric -1} ...)

gen/let - это макрос, который позволяет вам использовать знакомый let -подобный синтаксис, но он расширяется до test.check fmap и bind звонки, которые вы также можете использовать напрямую.

Когда у вас есть собственный генератор, вы можете использовать s/with-gen, чтобы объединить его со своей спецификацией, или передать его в карту переопределений для функций спецификаций, которые принимают переопределения генератора.

0
ответ дан Taylor Wood 22 February 2019 в 15:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: