Стиль С printf / scanf - PullRequest
       38

Стиль С printf / scanf

1 голос
/ 04 декабря 2009

Я видел здесь и в других местах много вопросов о том, что для получения входных данных используйте что-то вроде этого:

 ...
 printf("What's your name? ");
 scanf("%s",name);
 ...

Это очень напоминает старые ОСНОВНЫЕ дни (INPUT для тех, кто его помнит).

Большинство этих вопросов, если не все, относятся к людям, которые только изучают C, и являются домашними заданиями или примером, взятым из их книги.

Я четко помню, что когда я изучал C, мне сказали, что этот тип вопросов / ответов не является хорошей практикой для получения пользовательского ввода. «Правильный путь» заключался либо в получении параметров в командной строке (argv[...]), либо в чтении из файла данных, который нужно проанализировать с помощью fgets(). Когда удобство использования было обязательным, termio и друзья должны были использоваться.

Теперь мне интересно, изменилось ли что-нибудь за последние годы. Нужно ли людям структурировать взаимодействие с пользователем как заданный вопрос / ответ сейчас?

Я вижу только недостатки в использовании подхода printf () / scanf (), основным из которых является разнообразие терминалов (^ H кто-нибудь?), Которые могут затруднить пользователю исправление ошибок.

Может ли кто-нибудь указать мне на конкретные преимущества этого подхода?

Ответы [ 6 ]

4 голосов
/ 04 декабря 2009

Эту структуру легко объяснить и легко освоить, поэтому она появляется во многих вводных материалах. Неправильный ввод данных пользователем на C может показаться довольно сложным, особенно когда вам приходится иметь дело с токенизацией и преобразованиями.

Однако я согласен, что для вводных материалов было бы полезно продемонстрировать более надежные методы обработки пользовательского ввода.

2 голосов
/ 04 декабря 2009

Я всегда думал, что способ Unix - принимать входные данные от stdin. Таким образом, вызывающая команда может передавать данные из другой команды, из файла или вручную.

1 голос
/ 04 декабря 2009

Библиотека GNU readline действительно отличный ресурс для этого. Его главное преимущество заключается в том, что он обрабатывает все сложности редактирования, а также позволяет пользователям иметь свои собственные настройки ввода, например, режим Vi или Emacs.

Это библиотека bash и многие другие программы, которые допускают использование интерактивных линейных данных. Используя библиотеку, вы получаете интерфейс, который ваши пользователи будут иметь некоторые знания о том, как его использовать, плюс вы получите все виды приятных функций без необходимости явного кодирования поддержки редактирования строки.

1 голос
/ 04 декабря 2009

fgets() / sscanf() или аналогичный - правильный способ принять пользовательский ввод.

Возьмите то, что вы прочитали здесь и в другом месте (щепоткой соли).

0 голосов
/ 04 декабря 2009

Я согласен с CTFord: если вы работаете с программой командной строки, тогда stdin - вполне разумный способ справиться с вводом.

Однако в настоящее время правильный способ состоит в том, чтобы сделать окно с текстовым полем меткой, кнопкой и бла-бла-бла.

Я знаю, что это на самом деле не отвечает на ваш вопрос, но я думаю, что моя точка зрения заключается в том, что этот стиль программирования стал НАМНОГО менее распространенным, так что на самом деле не имеет значения, что является «правильным».

0 голосов
/ 04 декабря 2009

Во многих случаях вы, вероятно, упускаете смысл упражнения, если считаете, что это важно. Существует разница между домашним заданием и реальными программами. Целью таких упражнений редко, если вообще когда-либо, является обучение дизайну пользовательского интерфейса; Техника, которую вы описываете, - это, как правило, простой способ получить тестовые данные для реального упражнения, и, вероятно, также поощряется преподавателями, которые, не торопясь, требуют, чтобы представленный код придерживался некоторого «стиля курса», чтобы облегчить маркировку. «Стиль курса» редко совпадает с «хорошей практикой» или «практическим стилем», но это не означает, что он не служит какой-то цели или даже что эта цель полезна для обучения студентов.

К сожалению, новички часто зацикливаются на этом, когда оно вообще не имеет отношения к реальной цели упражнения. Проблема в том, что пользовательский ввод с использованием стандартных библиотечных примитивов не так надежен, и некоторые преподаватели, похоже, думают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...