Что должен вернуть scanf на EOF после частичного совпадения? - PullRequest
1 голос
/ 25 апреля 2011

Рассмотрим следующие scanf спецификаторы преобразования и входные данные:

  • "%4c" и "abc"
  • "%x" и "0x"
  • "%f" и "1.0e+"

То есть, когда входные данные являются начальной подпоследовательностью совпадения, но не совпадением. Предполагая, что EOF достигнут после неполного совпадения, scanf должен возвращать EOF или 0? Текст на С99 гласит:

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

А в POSIX 2008 он гласит:

После успешного завершения эти функции должны возвращать количество успешно сопоставленных и назначенных элементов ввода; это число может быть нулевым в случае неудачного раннего сопоставления. Если ввод заканчивается до первого неудачного или конверсионного совпадения, EOF должен быть возвращен. Если возникает какая-либо ошибка, EOF должен быть возвращен, [CX] и errno должны быть установлены для указания ошибки. Если происходит ошибка чтения, должен быть установлен индикатор ошибки для потока.

Что мне неясно, так это то, является ли частичное, но неполное совпадение «ошибкой раннего сопоставления». Я нашел бы возвращаемое значение 0 в этом случае намного более полезным (оно отличает случаи простого EOF от неверных усеченных данных), но мне нужна только помощь в интерпретации стандарта.

Обратите внимание, что scanf в glibc абсолютно неверен на всех этих входах и возвращает 1, рассматривая неверный ввод как совпадение. Я почти уверен, что об этой проблеме было сообщено и отмечено WONTFIX. : - (

1 Ответ

1 голос
/ 25 апреля 2011

Я ожидаю 0.

7.16.6.2 / 4:

Ошибки описываются как ошибки ввода (из-за ошибки кодирования или недоступности inoutсимволов) или сбои в сопоставлении (из-за неправильного ввода).

...