Это домашняя работа, поэтому вам может потребоваться работать с определенными (произвольными) ограничениями.Тем не менее, фраза «scanf
обработка ошибок» является чем-то оксюморонным в языке программирования C.
лучший способ сделать это - прочитать строку / другой подходящий фрагменти разобрать его с помощью строковых функций Си.Вы можете сделать это в одной строке scanf
, но есть много недостатков:
- Вы можете защититься от переполнения буфера, но если буфер недостаточно велик, вы не сможете восстановить.
- Вы можете указать определенные диапазоны символов для своих строк, но это начинает выглядеть немного регулярным, и поведение формата
"%["
scanf
не является обязательным в стандарте. - Вы можете проверить третье имя, но код выглядит не интуитивно понятным - не похоже, что вы хотите только два имени, похоже, что вы хотите три.
scanf
также дает вам очень мало контроля над тем, как вы обрабатываете пробелы.
РЕДАКТИРОВАТЬ: я изначально думал из вашего вопроса, что имена были заключены в квадратные скобки (а-ля "[Bruce] [Wayne]"
), но теперь он появляетсяэто было просто ваше соглашение для обозначения заполнителя.
В любом случае, несмотря на мою сильную неприязнь к scanf
, у него есть свои применения.Самым главным убийцей (для меня) является неспособность различить окончания строк и простое разделение пространства.Чтобы это исправить, вы можете вызвать fgets
для чтения данных в буфер, затем , вызвать sscanf
в буфере.Это дает вам обоим: а) более безопасное чтение (scanf
портит способность других более простых функций читать из буфера) и б) преимущества форматов scanf
.
Если вам нужно использовать scanf
, ваш формат в основном таков:
" %s %s %s"
С третьим нежелательным.Как показывает ответ @ Constantinius , вам нужно прочитать данные в три буфера и проверить, прошел ли третий.Однако, если вы читаете несколько последовательных строк этих данных, то первая запись следующей строки будет удовлетворять третий слот, ложно давая вам ошибку.Я настоятельно рекомендую использовать fgets
и sscanf
или отключить sscanf
для более точного ручного анализа в этом случае.
Вот ссылка на справочную страницу fgets
, если выпропустил тот, который я пробрался ранее.Если вы решите отказаться от sscanf
, обратите внимание на некоторые другие функции: strchr
(или strspn
или strcspn
)чтобы узнать, как долго это имя, strcpy
или memcpy
(но, пожалуйста, не strncpy
, это не то, что вы думаете) скопировать данные в буферы.