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