Игнорирование / пропуск токенов с использованием std :: cin

С scanf один может пропускать соответствующие токены, просто добавляя * в шаблон, как в:

int first, second;
scanf("%d %*s %d", &first, &second);

Есть ли эквивалентный подход с std::cin? Что-то вроде (конечно, избавляя от использования дополнительных переменных):

int first, second;
std::cin >> first >> `std::skip` >> second;

6

Решение

Это не простая задача для потоков ввода в C ++, чтобы сделать то же самое. функция scanf получает все ожидаемый формат: "%d %*s %d" и может смотреть вперед, чтобы определить, что происходит.

С другой стороны, оператор >> просто пытается удовлетворить текущий входной параметр.


У вас есть шансы написать свой собственный манипулятор istream для ввода данных до достижения цифры.

Попробуйте этот мой наивный код:

template<typename C, typename T>
basic_istream<C, T>&
eat_until_digit(basic_istream<C, T>& in)
{
const ctype<C>& ct = use_facet <ctype<C>> (in.getloc());

basic_streambuf<C, T>* sb = in.rdbuf();

int c = sb->sgetc();
while (c != T::eof() && !ct.is(ctype_base::digit, c))
c = sb->snextc();

if (c == T::eof())
in.setstate(ios_base::eofbit);

return in;
}

int main()
{
int first, second;

cin >> first >> eat_until_digit >> second;

cout << first << " : " << second << endl;
}

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

3

Другие решения

Вы, вероятно, ищете C ++ String Toolkit Library.

Проверьте это для более пример

Или вы можете попробовать с ignore функционировать так:

std::cin >> val1;
std::cin.ignore (1234, ' ');
std::cin >> val3;

Что-то вроде этого:-

template <class charT, class traits>
inline std::basic_istream<charT, traits> &
ignoreToken (std::basic_istream<charT, traits> &strm)
{
strm.ignore (1234, ' ');
return strm;
}

А затем используйте как:

cin >> val1 >> ignoreToken >> val3 >> ignoreToken >> val5;
3

Вы можете просто использовать фиктивную переменную

int first, second;
std::string dummy;
cin >> first >> dummy >> second;

но нет прямого эквивалента AFAIK.

2
По вопросам рекламы [email protected]