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

回答編集履歴

6

コマンド名が何でもよいコードを追加

2021/05/08 15:53

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -35,8 +35,18 @@
35
35
  {
36
36
  return c ? **v - '0' > 9u ? printf("%d\n", main(c-1, v+1)) :
37
37
  **v - '0' + main(c-1, v+1) : 0;
38
-
39
38
  }
40
39
  ```
41
40
  **追記3**
42
- 9 があると正しい結果が出ないバグを修正しました。
41
+ 9 があると正しい結果が出ないバグを修正しました。
42
+
43
+ **追記4**
44
+ コマンド名が数字で始まっていてもいいようにすると、
45
+ ```c
46
+ #include <stdio.h>
47
+
48
+ int main(int c, char **v)
49
+ {
50
+ return c ? printf("%d\n", main(0, v+1)) : *v ? **v - '0' + main(0, v+1) : 0;
51
+ }
52
+ ```

5

バグ修正

2021/05/08 15:53

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -33,7 +33,10 @@
33
33
 
34
34
  int main(int c, char **v)
35
35
  {
36
- return c ? **v - '0' < 9u ? **v - '0' + main(c-1, v+1) :
36
+ return c ? **v - '0' > 9u ? printf("%d\n", main(c-1, v+1)) :
37
- printf("%d\n", main(c-1, v+1)) : 0;
37
+ **v - '0' + main(c-1, v+1) : 0;
38
+
38
39
  }
39
- ```
40
+ ```
41
+ **追記3**
42
+ 9 があると正しい結果が出ないバグを修正しました。

4

+= や ++ を使わないコードを追加

2021/05/07 13:06

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -13,4 +13,27 @@
13
13
 
14
14
  **追記**
15
15
  条件に 1桁の整数とあるので atoi は不要でした。
16
- `atoi(*++v)` を `**++v - '0'` に変更してください。
16
+ `atoi(*++v)` を `**++v - '0'` に変更してください。
17
+
18
+ **追記2**
19
+ ./ex 1 2 3 だと、c=4, v[0]="./ex", v[1]="1", v[2]="2", v[3]="3", v[4]=NULL
20
+ --c, ++v で main が再帰的に呼び出されると、次のようになります。
21
+ c=3, v[0]="1", v[1]="2", v[2]="3", v[3]=NULL
22
+ c=2, v[0]="2", v[1]="3", v[2]=NULL
23
+ c=1, v[0]="3", v[1]=NULL
24
+ c=0, v[0]=NULL
25
+
26
+ ++ も使ってはいけないのですか?
27
+ 質問に追記してください
28
+ システムコールとは何ですか?
29
+ Unix(Linux) なら open, close, read, write などをシステムコールと言います。
30
+
31
+ ```c
32
+ #include <stdio.h>
33
+
34
+ int main(int c, char **v)
35
+ {
36
+ return c ? **v - '0' < 9u ? **v - '0' + main(c-1, v+1) :
37
+ printf("%d\n", main(c-1, v+1)) : 0;
38
+ }
39
+ ```

3

誤字修正

2021/05/07 08:44

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -12,5 +12,5 @@
12
12
  += を使わない方法もありますが、知りたいですか?
13
13
 
14
14
  **追記**
15
- 条件に 1桁の整数とあるので atoi は不要でした。
15
+ 条件に 1桁の整数とあるので atoi は不要でした。
16
16
  `atoi(*++v)` を `**++v - '0'` に変更してください。

2

atoi を使わない

2021/05/07 06:30

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -9,4 +9,8 @@
9
9
  --c ? s += atoi(*++v), main(c, v) : printf("%d\n", s);
10
10
  }
11
11
  ```
12
- += を使わない方法もありますが、知りたいですか?
12
+ += を使わない方法もありますが、知りたいですか?
13
+
14
+ **追記**
15
+ 条件に 1桁の整数とあるので atoi は不要ですした。
16
+ `atoi(*++v)` を `**++v - '0'` に変更してください。

1

*v[] -> **v

2021/05/07 06:16

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -3,7 +3,7 @@
3
3
  #include <stdio.h> // printf
4
4
  #include <stdlib.h> // atoi
5
5
 
6
- int main(int c, char *v[])
6
+ int main(int c, char **v)
7
7
  {
8
8
  static int s;
9
9
  --c ? s += atoi(*++v), main(c, v) : printf("%d\n", s);