Используя сброс (stdin)

Так в чем же причина того, что структура модели отличается от структуры HTML-разметки? Если это из-за DTO, то ваш подход неверен. Модель формы не должна отражать модель DTO (как это обычно бывает в формах, управляемых моделью), поскольку вы сможете отображать модель формы и DTO при постобработке. На мой взгляд, это главная причина, по которой он существует - отделить форму от модели данных.

Модель формы должна быть отражена в HTML.

РЕДАКТИРОВАТЬ: В любом случае, если вы хотите пойти по этому пути, вы всегда можете связать элемент управления формы напрямую - только для этого элемента управления - вместо использования группы / имен формы с помощью [formControl] и FormGroup#get. Более или менее это будет похоже на


Если у вас нет ссылки на группу форм верхнего уровня, вы можете использовать https://angular.io/api/forms/AbstractControl#parent пройти к нему.

67
задан Lundin 1 March 2018 в 10:26
поделиться

3 ответа

Просто: это неопределенное поведение, поскольку fflush предназначен для вызова на выходном потоке. Это выдержка из стандарта C:

int fflush(FILE *ostream);

ostream указывает на поток вывода или поток обновления, в котором последняя последняя операция не была входной, функция функция fflush заставляет все незаписанные данные для этого потока, которые должны быть доставлены в среду хоста, чтобы быть записанными в файл; в противном случае поведение не определено.

Так что это не вопрос "насколько это плохо". fflush(stdin) является откровенно неправильным, и вы не должны его использовать, никогда.

67
ответ дан 24 November 2019 в 14:38
поделиться

Я полагаю, что Вы должны никогда вызов fflush(stdin) по простой причине, что необходимо даже не считать необходимым попытаться сбросить вход во-первых. Реалистично, существует только одна причина, Вы могли бы думать, что имели к, и это: закончить некоторый плохой вход, что scanf застревает на.

, Например, у Вас могла бы быть программа, которая находится в цикле, читая целые числа с помощью scanf("%d", &n), и Вы обнаружили, что в первый раз пользователь вводит символ нецифры как 'x', , программа входит в бесконечный цикл .

, Когда сталкивающийся с этой ситуацией, я полагаю, что у Вас в основном есть три варианта:

  1. Сброс вход так или иначе (если не при помощи fflush(stdin), то путем вызова getchar для чтения символов до \n, как часто рекомендуется).
  2. Говорят пользователю не вводить символы нецифры, когда цифры ожидаются.
  3. Использование что-то другое, чем scanf для чтения входа .

Теперь, если Вы - новичок, scanf , кажется как самый легкий способ считать вход, и таким образом, выбор № 3 является страшным и трудным. Но № 2 походит на реальную отговорку, потому что все знают, что недружелюбные пользователем компьютерные программы являются проблемой, таким образом, было бы хорошо добиться большего успеха. Так слишком многие начинающие программисты поставились себя в безвыходное положение, чувствуя, что у них нет выбора, кроме как сделать № 1. Они более или менее должны сделать вход с помощью scanf, означая, что он застрянет на плохом входе, означая, что они должны выяснить способ сбросить плохой вход, означая, что они очень испытывают желание использовать fflush(stdin).

я хотел бы поощрить всех программистов начала там делать другой набор компромиссов:

  1. Во время ранних стадий Вашего C программирование карьеры, прежде чем Вы будете удобным использованием чего-либо кроме [1 111], всего , не волнуется о плохом входе .В самом деле. Разрешение и отговорка использования № 2 выше. Думайте об этом как это: Вы - новичок, существует много вещей, которые Вы не знаете, как сделать все же, и одна из вещей, которые Вы не знаете, как сделать, все же: имейте дело корректно с неожиданным входом.

  2. , Как только Вы можете, , изучают, как сделать вход с помощью функций кроме [1 112] . В той точке можно начать иметь дело корректно с плохим входом, и у Вас будет намного больше, намного лучшие методы доступный Вам, которые не потребуют попытки сбросить плохой вход вообще.

Или, другими словами, новички, которые все еще застревают с помощью [1 113], должны не стесняться использовать отговорку № 2, и когда они готовы, они должны получить высшее образование оттуда к технике № 3, и никто не должен использовать технику № 1, чтобы попытаться сбросить вход вообще (и конечно не с [1 114].

0
ответ дан 24 November 2019 в 14:38
поделиться

Согласно стандарту, fflush может использоваться только с выходными буферами, и, очевидно, stdin не является одним из них. Однако некоторые стандартные библиотеки C предоставляют использование fflush (stdin) в качестве расширения. В этом случае вы можете использовать его, но это повлияет на переносимость, поэтому вы больше не сможете использовать какую-либо совместимую со стандартами стандартную библиотеку C на земле и ожидать тех же результатов.

18
ответ дан 24 November 2019 в 14:38
поделиться
Другие вопросы по тегам:

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