Clipboard. Clear Метод
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Удаляет все данные из буфера обмена.
Исключения
Не удалось очистить буфер обмена. Обычно это происходит, когда буфер обмена используется другим процессом.
Текущий поток не выполняется в режиме апартмента с одним потоком (STA). Добавьте STAThreadAttribute в метод Main своего приложения.
Примеры
В следующем примере показан этот элемент.
Комментарии
Так как буфер обмена используется несколькими процессами, вызов этого метода может повлиять на эти процессы.
Класс Clipboard можно использовать только в потоках в режиме однопотоковой квартиры (STA). Чтобы использовать этот класс, убедитесь, что Main метод помечен атрибутом STAThreadAttribute .
Очистка входного буфера в C / C ++
Что такое буфер?
Область временного хранения называется буфером. Все стандартные устройства ввода и вывода содержат буфер ввода и вывода. В стандартном C / C ++ потоки буферизуются, например, в случае стандартного ввода, когда мы нажимаем клавишу на клавиатуре, она не отправляется в вашу программу, а буферизируется операционной системой до тех пор, пока время не будет выделено для этого. программа.
Как это влияет на программирование?
В некоторых случаях вам может потребоваться очистить ненужный буфер, чтобы получить следующий ввод в желаемом контейнере, а не в буфере предыдущей переменной. Например, в случае C после встречи с «scanf ()», если нам нужно ввести массив символов или символ, и в случае C ++, после встречи с оператором «cin», мы требуем ввести массив символов или строку, нам нужно очистить буфер ввода, иначе желаемый ввод будет занят буфером предыдущей переменной, а не нужным контейнером. При нажатии «Enter» (возврат каретки) на экране вывода после первого ввода, поскольку буфер предыдущей переменной был пространство для нового контейнера (как мы его не очищали), программа пропускает следующий ввод контейнера.
Как очистить буфер ввода в C?
Как объяснил автор приведенного выше кода: Программа не будет работать должным образом, потому что в строке 1, когда пользователь нажимает Enter, во входном буфере остается 2 символа: Enter key (ASCII code 13) и \n (ASCII code 10) . Следовательно, в строке 2 он будет читать \n и не будет ждать, пока пользователь введет символ.
Хорошо, я понял. Но мой первый вопрос: почему второй getchar() ( ch2 = getchar(); ) не читает Enter key (13) , а не \n символ?
Далее автор предложил 2 способа решения таких проблем:
напишите такую функцию:
Этот код действительно работал. Но я не могу себе объяснить, как это работает? Поскольку в операторе while, который мы используем getchar() != ‘\n’ , это означает чтение любого отдельного символа, кроме ‘\n’ ? если да, то во входном буфере все равно остается ‘\n’ символ?
Программа не будет работать должным образом, потому что в строке 1, когда пользователь нажимает Enter, он оставит в буфере ввода 2 символа: клавишу Enter (код ASCII 13) и \ n (код ASCII 10). Следовательно, в строке 2 он будет читать \ n и не будет ждать, пока пользователь введет символ.
Поведение, которое вы видите в строке 2, правильное, но это не совсем правильное объяснение. В потоках текстового режима не имеет значения, какие окончания строки использует ваша платформа (будь то возврат каретки (0x0D) + перевод строки (0x0A), чистый CR или простой LF). Библиотека времени выполнения C позаботится об этом за вас: ваша программа будет видеть только ‘\n’ символы новой строки.
Если вы набрали символ и нажали Enter, то этот вводимый символ будет прочитан в строке 1, а затем ‘\n’ будет прочитан в строке 2. См. Я использую, scanf %c чтобы прочитать ответ Y / N, но более поздний ввод пропускается.из FAQ по comp.lang.c.
Что касается предлагаемых решений, см. (Опять же из FAQ comp.lang.c):
которые в основном заявляют, что единственный переносимый подход — это сделать:
Твой getchar() != ‘\n’ цикл работает, потому что после вызова getchar() возвращенный символ уже был удален из входного потока.
Кроме того, я чувствую себя обязанным отговорить вас от употребления scanf полностью: почему все говорят не использовать scanf ? Что мне использовать вместо этого?