Подтвердить что ты не робот

Что произойдет, если я забуду закрыть сканирование?

Предположим, я забыл закрыть прямоугольную скобку ] сканера. Что будет тогда? Вызывает ли он Undefined Поведение?

Пример:

char str[] = "Hello! One Two Three";
char s1[50] = {0}, s2[50] = {0};
sscanf(str, "%s %[^h", s1, s2); /* UB? */
printf("s1='%s' s2='%s'\n", s1, s2);

Я получаю предупреждение от GCC при компиляции:

source_file.c: In function ‘main’:
source_file.c:11:5: warning: no closing ‘]’ for ‘%[’ format [-Wformat=]
     sscanf(str, "%s %[^h", s1, s2); /* UB? */

и вывод в виде

s1='Hello!' s2=''

Я также заметил, что sscanf возвращает 1. Но что именно происходит здесь?

Я проверил стандарт C11, но не нашел никакой информации, связанной с этим.

4b9b3361

Ответ 1

Отлично! Вы должны отправить отчет о дефектах для C11!

Вот соответствующая часть в C11 7.21.6.2

... Спецификатор преобразования включает в себя все последующие символы в строке формата, вплоть до подходящей правой скобки (]). Символы между скобками (список сканирования) составляют сканирование, если только символ после левого скобки не является обходным (^), и в этом случае сканирование содержит все символы, которые не отображаются в списке сканирования между округлой и правой скобками.

Строгая интерпретация символов между скобками заключается в том, что в отсутствие закрывающей скобки таких символов нет, но в присутствии ^ в качестве первого символа после [ это было бы непоследовательно. gcc достаточно любезен, чтобы указать вероятную ошибку в исходном коде. Фактическое поведение определяется реализацией библиотеки C, но, как представляется, не указано в стандарте C. Таким образом, это форма поведения undefined, которую IMHO должно действительно документировать как таковое в Стандарте.