回答編集履歴

1

質問への回答を追加

2021/02/24 07:37

投稿

kazuma-s
kazuma-s

スコア8224

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
+ ```