回答編集履歴
1
質問への回答を追加
answer
CHANGED
@@ -52,4 +52,59 @@
|
|
52
52
|
+ if (acc > cutoff || acc == cutoff && c > cutlim) {
|
53
53
|
```
|
54
54
|
|
55
|
-
170行目にも同様の修正が必要です。
|
55
|
+
170行目にも同様の修正が必要です。
|
56
|
+
|
57
|
+
**追記**
|
58
|
+
質問への回答です。
|
59
|
+
|
60
|
+
char str[5] = "0123", *p; で
|
61
|
+
int b = strtol(str, &p, 10); の場合を説明します。
|
62
|
+
|
63
|
+
**str** は **str[0] を指すポインタ** です。**str の値** は **str[0] のアドレス** です。
|
64
|
+
**&p** は **p を指すポインタ** です。**&p の値** は **p のアドレス** です。
|
65
|
+
10 は基数です。文字列が 10進数だとして int に変換してほしいということです。
|
66
|
+
|
67
|
+
これらの引数を用意して、main から strtol を呼び出すと、
|
68
|
+
呼び出された strtol は、次のように動きます。
|
69
|
+
・str[0] へのポインタがあるので、
|
70
|
+
str[0] の値である '0' を得て、そこから '0' を引いて int の 0 を得ます。
|
71
|
+
・str[0] へのポインタがあるので、次の str[1] の値 '1' から 1 を得ます。
|
72
|
+
・最初に憶えた int の値 0 を 10倍して、1 を足すと 1 になります。
|
73
|
+
・str[0] へのポインタがあるので、次の str[2] の値 '2' から 2 を得ます。
|
74
|
+
・覚えている int の値 1 を 10倍して、2 を足すと 12 になります。
|
75
|
+
・str[0] へのポインタがあるので、次の str[3] の値 '3' から 3 を得ます。
|
76
|
+
・覚えている int の値 12 を 10倍して、3 を足すと 123 になります。
|
77
|
+
・str[0] へのポインタがあるので、次の str[4] の値 '\0' を得ます。
|
78
|
+
これは数字ではないので変換終了。
|
79
|
+
・p へのポインタがあるので、p に str[4] のアドレスを入れます。
|
80
|
+
・int の 123 を返します。
|
81
|
+
main に返ると、strtol が返した 123 という値で b を初期化します。
|
82
|
+
|
83
|
+
これが strtol の動きを具体的に説明したものです。
|
84
|
+
基数が 10以外の場合どうなるか、次のコードで考えてみてください。
|
85
|
+
```C
|
86
|
+
#include <stdio.h> // printf
|
87
|
+
#include <stdlib.h> // strtol
|
88
|
+
|
89
|
+
int main(void)
|
90
|
+
{
|
91
|
+
char str[] = "0123";
|
92
|
+
char *p;
|
93
|
+
int i;
|
94
|
+
printf(" str = %p, str = [%s]\n", str, str);
|
95
|
+
i = strtol(str, &p, 16); printf("16: p = %p: i = %d\n", p, i);
|
96
|
+
i = strtol(str, &p, 10); printf("10: p = %p: i = %d\n", p, i);
|
97
|
+
i = strtol(str, &p, 8); printf(" 8: p = %p: i = %d\n", p, i);
|
98
|
+
i = strtol(str, &p, 2); printf(" 2: p = %p: i = %d\n", p, i);
|
99
|
+
i = strtol(str, &p, 0); printf(" 0: p = %p: i = %d\n", p, i);
|
100
|
+
}
|
101
|
+
```
|
102
|
+
実行結果
|
103
|
+
```
|
104
|
+
str = 0x7fffd58dd6a3, str = [0123]
|
105
|
+
16: p = 0x7fffd58dd6a7: i = 291
|
106
|
+
10: p = 0x7fffd58dd6a7: i = 123
|
107
|
+
8: p = 0x7fffd58dd6a7: i = 83
|
108
|
+
2: p = 0x7fffd58dd6a5: i = 1
|
109
|
+
0: p = 0x7fffd58dd6a7: i = 83
|
110
|
+
```
|