回答編集履歴

4

追記

2017/10/28 07:05

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -61,3 +61,87 @@
61
61
  }
62
62
 
63
63
  ```
64
+
65
+
66
+
67
+ 追記:ご指摘を受けて
68
+
69
+ ---
70
+
71
+ [strtol](http://www.c-tipsref.com/reference/stdlib/strtol.html)を使うことで簡潔に書けました。yumetodoさん、ご指摘ありがとうございます。
72
+
73
+ ```C
74
+
75
+ #include <stdio.h>
76
+
77
+ #include <stdlib.h>
78
+
79
+
80
+
81
+ int main(void) {
82
+
83
+ char *hoge = "65 66 67";
84
+
85
+
86
+
87
+ for(char *pt = hoge; pt[0] != '\0';) {
88
+
89
+ long num = strtol(pt, &pt, 10);
90
+
91
+ printf("%c\n", (char)num);
92
+
93
+ }
94
+
95
+ printf("%s\n", hoge);
96
+
97
+
98
+
99
+ return 0;
100
+
101
+ }
102
+
103
+ ```
104
+
105
+
106
+
107
+ **実行結果**
108
+
109
+ ```
110
+
111
+ A
112
+
113
+ B
114
+
115
+ C
116
+
117
+ 65 66 67
118
+
119
+ ```
120
+
121
+
122
+
123
+ ---
124
+
125
+ エラーに対して頑健にするには、もうちょっといじる必要があります。
126
+
127
+ 0. オーバーフローが起きていないか (3番目に含まれる)
128
+
129
+ 0. 10進数として解釈できない文字に突き当たっていないか
130
+
131
+ 0. 得られた数値はアスキーコードとして解釈可能か
132
+
133
+
134
+
135
+ ```C
136
+
137
+ // if(errno == ERANGE) break;
138
+
139
+ if(!isspace(pt[0]) && pt[0] != '\0') break;
140
+
141
+ if(num < 0 || (1 << 7) <= num ) break;
142
+
143
+ ```
144
+
145
+
146
+
147
+ これで足りるのかなぁ... 本当にC言語は難しいです。

3

追記

2017/10/28 07:05

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -33,3 +33,31 @@
33
33
  C
34
34
 
35
35
  ```
36
+
37
+
38
+
39
+ ---
40
+
41
+ 適当にatoi的な何かをコーディングしてみました。
42
+
43
+ 実際のatoiはもっと複雑ですが、『一文字ずつ処理している』イメージは掴めるかと思います。
44
+
45
+ ```C
46
+
47
+ int my_atoi(const char *arg) {
48
+
49
+ int ret = 0;
50
+
51
+ for(const char* pt = arg; *pt != '\0'; ++pt) {
52
+
53
+ ret *= 10;
54
+
55
+ ret += *pt - '0';
56
+
57
+ }
58
+
59
+ return ret;
60
+
61
+ }
62
+
63
+ ```

2

修正

2017/10/27 13:16

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -1,4 +1,4 @@
1
- 文字列から数値へと、[atoi](http://www.c-tipsref.com/reference/stdlib/atoi.html)などで明示的にねばなりません。
1
+ 文字列から数値へと、[atoi](http://www.c-tipsref.com/reference/stdlib/atoi.html)などで明示的に置きねばなりません。
2
2
 
3
3
 
4
4
 

1

修正

2017/10/27 12:42

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -13,10 +13,6 @@
13
13
  int main(void) {
14
14
 
15
15
  char *hoge = "67";
16
-
17
-
18
-
19
- putchar((char)*hoge);
20
16
 
21
17
  putchar(atoi(hoge));
22
18
 
@@ -34,6 +30,6 @@
34
30
 
35
31
  ```
36
32
 
37
- 6C
33
+ C
38
34
 
39
35
  ```