teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

質問への回答を追加

2021/02/24 07:37

投稿

kazuma-s
kazuma-s

スコア8222

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