Вопрос по c++ – Разница между cin.ignore и cin.sync

9

В чем разница междуcin.ignore а такжеcin.sync ?

Ваш Ответ

1   ответ
14

cin.ignore сбрасывает символы до указанного числа или до достижения разделителя (если он включен). Если вы вызываете его без аргументов, он удаляет один символ из входного буфера.

Например,cin.ignore (80, '\n') игнорирует либо 80 символов, либо столько, сколько находит, пока не попадет на новую строку.

cin.sync отбрасывает все непрочитанные символы из входного буфера. Однако это не гарантируется в каждой реализации. Следовательно,ignore - лучший выбор, если вы хотите последовательности.

cin.sync() просто очистит что осталось. Единственное использование, которое я могу придумать дляsync() это невозможно сделать сignore является заменой дляsystem ("PAUSE");:

cin.sync(); //discard unread characters (0 if none)
cin.get(); //wait for input

Сcin.ignore() а такжеcin.get(), это может быть что-то вроде смеси:

cin.ignore (std::numeric_limits<std::streamsize>::max(),'\n'); //wait for newline
//cin.get()

Если осталась новая строка, просто ставлюignore, похоже, пропустит это. Однако установка обоих будет ждать двух вводов, если нет новой строки. Отказ от всего, что не прочитано, решает эту проблему, но, опять же, не согласуется.

Можете ли вы показать мне конкретные реализации, которые cin.sync небезопасны! 5fox
@ 5fox: я могу показать вам реализации, где ничего не происходит: Ideone.com / AR8lB Benjamin Lindley
ignore () должен вызываться перед cin или после cin? Точнее говоря, в первый раз, когда я обращаюсь к cin, нужно ли сбрасывать ненужные данные в буфер, если таковые имеются? Или программа будет все сбрасывать при вводе main? Но что я заметил, так это то, что если мы вызываем ignore (), он ждет некоторого не пробельного символа в первый раз. Rajesh
@ Раджеш, после. Во входном буфере не должно быть случайных вещей при запуске программы. Обычный вариант использования для этого - очистить введенный пользователем неверный ввод или избавиться от новой строки, оставшейся после операции ввода. chris
@ Крис Такс для информации. Почему мой код ниже не может принять строку? Если введена пустая строка, я хочу, чтобы цикл while запрашивал у пользователя новую строку. Код не работает для пустой строки или для допустимой строки. линии ignore () беспокоит меня, похоже, и если я удаляю ignore (), все работает. Но я волнуюсь, если это может создать проблемы позже, так как я не очищаю буфер. void getString (string & str) {do {cout << "Введите строку:"; GetLine (станд :: CIN, ул); cin.ignore (std :: numeric_limits <std :: streamsize> :: max (), '\ n'); } while (str.empty ()); } Rajesh

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