What's the difference between %ul and %lu C format specifiers?

c, format-specifiers

Solution

`%lu` is correct, while `%ul` is incorrect.

A `printf` format specifier follows the form `%[flags][width][.precision][length]specifier`.

`u` is a specifier meaning "unsigned decimal integer".

`l` is a length modifier meaning "long".

The length modifier should go before the conversion specifier, which means `%lu` is correct.

Problem

In an example of "C Primer Plus", the author has used `%ul` format specifier (in both scanf and printf) for unsigned long. When I try to generalize the problem, it seems that the `%ul` makes something wrong in my computer. But using `%lu` solved the issue. Actually, rather than focusing on the problem and the line of codes, I want to know about the difference between `%ul` and `%lu`. Maybe I could figure out what's wrong. Searching doesn't give me something useful (except that "they are different"). Any explanation or link/reference is appreciated.

Original source