Что scanf должен возвращать в EOF после частичного совпадения?

#c #scanf #standards-compliance

#c #scanf #соответствие стандартам

Вопрос:

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

  • "L" и "abc"
  • "%x" и "0x"
  • "%f" и "1.0e "

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

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

И в POSIX 2008 это гласит:

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

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

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

Ответ №1:

Я ожидаю 0.

7.16.6.2/4:

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

Комментарии:

1. Это 7.19.6.2, не так ли? И пункт 15 кажется гораздо более решающим: «Если во время ввода встречается конец файла, преобразование завершается. Если конец файла происходит до того, как были прочитаны какие-либо символы, соответствующие текущей директиве (кроме начального пробела, где это разрешено), выполнение текущей директивы завершается ошибкой ввода; в противном случае, если выполнение текущей директивы не завершается ошибкой сопоставления, выполнение следующей директивы (кроме %n, если таковая имеется) завершается ошибкой ввода.»

2. Это было 7.19.6.2. Но ваш параграф 15 взят с C90, а не С99, где я не нахожу тот же язык.

3. Хорошо, C99 7.19.6.2, пункты 9 и 10, особенно 10, кажутся актуальными, и я думаю, что они в основном говорят то же самое…