Возьмите только di git в качестве ввода от scanf () и избегайте других символов - PullRequest
0 голосов
/ 05 февраля 2020

Я хочу использовать следующий формат ввода, используя scanf() до EOF, который будет избегать знака '+' и хранить только целочисленное значение.

Пример ввода:

1+2+8 

Вывод для приведенного выше ввода:

1 2 8

Я написал для этого следующий код:

 while(scanf("%d+",&tmp)) //here 'tmp' is int type variable
 {
    v.push_back(tmp);   //'v' is vector<int> type
 }

 for (int i = 0; i < v.size(); i++)
 {
    cout<<v[i]<<" ";
 }

К сожалению, пока l oop работает как бесконечный l oop. Каким будет решение этой проблемы?

1 Ответ

1 голос
/ 05 февраля 2020

std::cin решение

Поскольку вы уже используете std::cout 1 , вы можете использовать std::cin вместо scanf. Теперь сначала прочитайте число и обработайте знак после:

std::vector<int> numbers;
for (int n; std::cin >> n;) {
    numbers.push_back(n);
    if (std::cin.peek() == '+') { // if the next character is '+'
        std::cin.get();           // then discard it
    }
}

scanf решение

Если вы настаиваете на использовании scanf (в этом случае вы, вероятно, должны использовать printf), вы можете использовать функцию игнорирования управляющей строки scanf:

std::vector<int> numbers;
for (int n; std::scanf("%d%*1[+]", &n) == 1;) { // optionally discard '+' after number
    numbers.push_back(n);
}

Давайте разберем %*1[+] спецификацию преобразования вниз:

  • % - начало каждой спецификации преобразования;

  • * - результат этого преобразования следует отбрасывать, а не присваивать аргументу ;

  • 1 - ширина преобразования (т. Е. Максимальное количество символов для преобразования); и

  • [+] - спецификатор формата , который означает совпадение самой длинной строки, содержащей исключительно + (с учетом ограничения ширины, конечно).

В целом, эта спецификация преобразования означает «отбросить не более одного + символа».

Если знак + отсутствует, то scanf вернется, потому что использование нулевых символов для поля приводит к ошибке преобразования. Следующий символ не будет использован (что ожидается).

Обратите внимание, что scanf возвращает число получающих аргументов (аргументы после строки формата), успешно назначенных (которые могут быть равны нулю в если сбой сопоставления произошел до того, как был назначен первый принимающий аргумент), или EOF, если сбой ввода произошел до того, как был назначен первый получающий аргумент - см. страницу cppreference .


1 Вы на самом деле пишете cout, что, надо надеяться, std::cout введено в область действия using std::cout или using namespace std;.

...