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;
.