strtol

strtolは、文字列を指定された基数で変換(n進数の文字列だと解釈)する。

Man page of STRTOL
strtol, strtoll - cppreference.com

strtol.cで、

与えられた文字列を0, 2, 8, 10, 16を基数として変換。

$ vi strtol.c
$ gcc strtol.c -o strtol
$ ./strtol
str: 1010
l_0 = 1010
l_2 = 10
l_8 = 520
l_10 = 1010
l_16 = 4112

"1010"を試す。
0を基数は自動検出。10進数の1010として見てるのかな。
2を基数とすると、8 + 2だから10進数の10。
8を基数とすると、512 + 8だから10進数の520。
10を基数は、0を基数とする場合と同じ。
16を基数とすると、4096 + 16だから10進数の4112。

$ ./strtol
str: 9
l_0 = 9
l_2 = 0
l_8 = 0
l_10 = 9
l_16 = 9

9は10進数、16進数にしかないので、他は0。

$ ./strtol
str: a
l_0 = 0
l_2 = 0
l_8 = 0
l_10 = 0
l_16 = 10

aは16進数にしかないので、他は0。

$ ./strtol
str: 0xc
l_0 = 12
l_2 = 0
l_8 = 0
l_10 = 0
l_16 = 12

cもそうだけど、"0x"を付けてるので基数0の場合の自動検出でも変換できた。

$ ./strtol
str: 022
l_0 = 18
l_2 = 0
l_8 = 18
l_10 = 22
l_16 = 34
$

"0"を付けてるので、8進数で解釈すれば18。
ただ、10進数や16進数でも解釈できるのでそれだとそれぞれ、22、34と解釈される。

Sample/c/strtol/strtol/src/strtol at master · bg1bgst333/Sample · GitHub