回答編集履歴
1
質問への回答を追加
test
CHANGED
@@ -107,3 +107,113 @@
|
|
107
107
|
|
108
108
|
|
109
109
|
170行目にも同様の修正が必要です。
|
110
|
+
|
111
|
+
|
112
|
+
|
113
|
+
**追記**
|
114
|
+
|
115
|
+
質問への回答です。
|
116
|
+
|
117
|
+
|
118
|
+
|
119
|
+
char str[5] = "0123", *p; で
|
120
|
+
|
121
|
+
int b = strtol(str, &p, 10); の場合を説明します。
|
122
|
+
|
123
|
+
|
124
|
+
|
125
|
+
**str** は **str[0] を指すポインタ** です。**str の値** は **str[0] のアドレス** です。
|
126
|
+
|
127
|
+
**&p** は **p を指すポインタ** です。**&p の値** は **p のアドレス** です。
|
128
|
+
|
129
|
+
10 は基数です。文字列が 10進数だとして int に変換してほしいということです。
|
130
|
+
|
131
|
+
|
132
|
+
|
133
|
+
これらの引数を用意して、main から strtol を呼び出すと、
|
134
|
+
|
135
|
+
呼び出された strtol は、次のように動きます。
|
136
|
+
|
137
|
+
・str[0] へのポインタがあるので、
|
138
|
+
|
139
|
+
str[0] の値である '0' を得て、そこから '0' を引いて int の 0 を得ます。
|
140
|
+
|
141
|
+
・str[0] へのポインタがあるので、次の str[1] の値 '1' から 1 を得ます。
|
142
|
+
|
143
|
+
・最初に憶えた int の値 0 を 10倍して、1 を足すと 1 になります。
|
144
|
+
|
145
|
+
・str[0] へのポインタがあるので、次の str[2] の値 '2' から 2 を得ます。
|
146
|
+
|
147
|
+
・覚えている int の値 1 を 10倍して、2 を足すと 12 になります。
|
148
|
+
|
149
|
+
・str[0] へのポインタがあるので、次の str[3] の値 '3' から 3 を得ます。
|
150
|
+
|
151
|
+
・覚えている int の値 12 を 10倍して、3 を足すと 123 になります。
|
152
|
+
|
153
|
+
・str[0] へのポインタがあるので、次の str[4] の値 '\0' を得ます。
|
154
|
+
|
155
|
+
これは数字ではないので変換終了。
|
156
|
+
|
157
|
+
・p へのポインタがあるので、p に str[4] のアドレスを入れます。
|
158
|
+
|
159
|
+
・int の 123 を返します。
|
160
|
+
|
161
|
+
main に返ると、strtol が返した 123 という値で b を初期化します。
|
162
|
+
|
163
|
+
|
164
|
+
|
165
|
+
これが strtol の動きを具体的に説明したものです。
|
166
|
+
|
167
|
+
基数が 10以外の場合どうなるか、次のコードで考えてみてください。
|
168
|
+
|
169
|
+
```C
|
170
|
+
|
171
|
+
#include <stdio.h> // printf
|
172
|
+
|
173
|
+
#include <stdlib.h> // strtol
|
174
|
+
|
175
|
+
|
176
|
+
|
177
|
+
int main(void)
|
178
|
+
|
179
|
+
{
|
180
|
+
|
181
|
+
char str[] = "0123";
|
182
|
+
|
183
|
+
char *p;
|
184
|
+
|
185
|
+
int i;
|
186
|
+
|
187
|
+
printf(" str = %p, str = [%s]\n", str, str);
|
188
|
+
|
189
|
+
i = strtol(str, &p, 16); printf("16: p = %p: i = %d\n", p, i);
|
190
|
+
|
191
|
+
i = strtol(str, &p, 10); printf("10: p = %p: i = %d\n", p, i);
|
192
|
+
|
193
|
+
i = strtol(str, &p, 8); printf(" 8: p = %p: i = %d\n", p, i);
|
194
|
+
|
195
|
+
i = strtol(str, &p, 2); printf(" 2: p = %p: i = %d\n", p, i);
|
196
|
+
|
197
|
+
i = strtol(str, &p, 0); printf(" 0: p = %p: i = %d\n", p, i);
|
198
|
+
|
199
|
+
}
|
200
|
+
|
201
|
+
```
|
202
|
+
|
203
|
+
実行結果
|
204
|
+
|
205
|
+
```
|
206
|
+
|
207
|
+
str = 0x7fffd58dd6a3, str = [0123]
|
208
|
+
|
209
|
+
16: p = 0x7fffd58dd6a7: i = 291
|
210
|
+
|
211
|
+
10: p = 0x7fffd58dd6a7: i = 123
|
212
|
+
|
213
|
+
8: p = 0x7fffd58dd6a7: i = 83
|
214
|
+
|
215
|
+
2: p = 0x7fffd58dd6a5: i = 1
|
216
|
+
|
217
|
+
0: p = 0x7fffd58dd6a7: i = 83
|
218
|
+
|
219
|
+
```
|