回答編集履歴

3

気づいた点を追加

2018/06/22 09:03

投稿

rubato6809
rubato6809

スコア1380

test CHANGED
@@ -160,7 +160,7 @@
160
160
 
161
161
  ```
162
162
 
163
- 演算子直前の空白はどうすべきか、エラーチェックなどまだまだ不完全・・・ですが、流れがシンプルで見通しがよくなったと思います。
163
+ 演算子直前の空白はどうすべきか、エラーチェックなどまだまだ不完全・・・ですが、流れがシンプルで見通しがよくなったと思います。この線で私なりの完成形を作ることができました。
164
164
 
165
165
 
166
166
 
@@ -201,3 +201,7 @@
201
201
 
202
202
 
203
203
  - STRLEG は string length を短縮したのだと思いますが、LEG だと長さではなく「脚」になって良くない(脚にも長さあるがw)。重箱の隅のようだけど、格好悪いし、名前は案外大事だということで。6文字ならSTRLENかな。
204
+
205
+
206
+
207
+ - ```#define STRLEG 16``` ですが、int 型が 32bit なら10進数で10桁まで扱えるので、16文字では少ないと言えます。fgets()で入力するなら \n と \0 の2文字分を含めて、最低でも 10 + 1 + 10 + 2 = 23 文字、さらに空白文字の分もあったほうが良いでしょうね。

2

説明を一文追加

2018/06/22 09:03

投稿

rubato6809
rubato6809

スコア1380

test CHANGED
@@ -30,7 +30,7 @@
30
30
 
31
31
 
32
32
 
33
- そこで、こんなふうに組み直したらどうか(まずは、空白は無い、エラーチェックも要らないと仮定し、正常な処理の本筋だけを考えてみる)。
33
+ 要は、入力した文字列から2つの数字と演算子を切り出すことです。そこで、こんなふうに組み直したらどうか(まずは、空白は無い、エラーチェックも要らないと仮定し、正常な処理の本筋だけを考えてみる)。
34
34
 
35
35
 
36
36
 

1

str2num() を conv2num() に。他、少し表現を修正。

2018/06/22 08:01

投稿

rubato6809
rubato6809

スコア1380

test CHANGED
@@ -10,11 +10,11 @@
10
10
 
11
11
 
12
12
 
13
- p--; が必要になる理由は、``` for (p = str; *p != '\n'; p++)``` というループの中で数字やら演算子やらを切り出しているからです。ですから Chironian さんが指摘されたように、``` for (p = str; *p != '\n'; ) ``` というループに変更する手あるでしょうが、、、
13
+ p--; が必要になる理由は、``` for (p = str; *p != '\n'; p++)``` というループの中で数字やら演算子やらを切り出しているからです。ですから Chironian さんがおっしゃるように、``` for (p = str; *p != '\n'; ) ``` とする手あるでしょうが、、、
14
-
15
-
16
-
14
+
15
+
16
+
17
- もうひとつ、Chironianさん指摘しておられる、インデントが深いことも考慮する必要があります。インデントが深いほど理解しにくく、メンテナンスしにくくなるのだから。
17
+ もうひとつ、Chironianさん指摘、インデントが深いことも考慮する必要があります。インデントが深いほど理解しにくく、メンテナンスしにくくなるのだから。
18
18
 
19
19
  インデントが深くなる原因は、関数化していないことに加えて、``` for (p = str; ...)``` という大きなループの中で処理していることです。このforループの中で
20
20
 
@@ -86,7 +86,7 @@
86
86
 
87
87
 
88
88
 
89
- char *str2num(char *ptr, int *num) //(関名、良くないなw)
89
+ char *conv2num(char *ptr, int *num) // 字に変換する
90
90
 
91
91
  {
92
92
 
@@ -138,11 +138,11 @@
138
138
 
139
139
  p = str; // 入力行の先頭から
140
140
 
141
- p = str2num(p, &num1); // 数字ひとつめ
141
+ p = conv2num(p, &num1); // 数字ひとつめ
142
142
 
143
143
  op = *p++; // 演算子
144
144
 
145
- p = str2num(p, &num2); // 数字ふたつめ
145
+ p = conv2num(p, &num2); // 数字ふたつめ
146
146
 
147
147
 
148
148
 
@@ -160,7 +160,7 @@
160
160
 
161
161
  ```
162
162
 
163
- エラーチェックなどまだまだ不完全で、演算子直前の空白はどうしようか・・・ですが、見通しよくなったと思います。
163
+ 演算子直前の空白はどうすべきか、エラーチェックなどまだまだ不完全・・・ですが、流れがシンプルで見通しよくなったと思います。
164
164
 
165
165
 
166
166
 
@@ -200,4 +200,4 @@
200
200
 
201
201
 
202
202
 
203
- - STRLEG は string length を短縮したのだと思いますが、LEG だと長さではなく「脚」を連想して良くない(脚にも長さあるがw)。6文字ならSTRLENかな。重箱の隅のようだけど、格好悪いし、名前は案外大事だということで。
203
+ - STRLEG は string length を短縮したのだと思いますが、LEG だと長さではなく「脚」になって良くない(脚にも長さあるがw)。重箱の隅のようだけど、格好悪いし、名前は案外大事だということで。6文字ならSTRLENかな。