В чем разница между спецификаторами формата% ul и% lu C?

В примере с «C Primer Plus» автор использовал спецификатор формата %ul (как для scanf, так и для printf) для unsigned long . Когда я пытаюсь обобщить проблему, кажется, что %ul делает что-то не так на моем компьютере. Но использование %lu решило проблему.

На самом деле, вместо того, чтобы сосредоточиться на проблеме и строке кодов, я хочу знать о различии между %ul и %lu . Может быть, я могу понять, что случилось.

Поиск не дает мне что-то полезное (кроме того, что «они разные»).

Любое объяснение или ссылка / ссылка приветствуются.

%lu правильно, а %ul неверно .

printf формата printf следует за формой %[flags][width][.precision][length]specifier .

uспецификатор, означающий «беззнаковое целое число».

l – модификатор длины , означающий «long».

Модификатор длины должен идти до спецификатора преобразования, что означает, что %lu является правильным.