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

回答編集履歴

3

別解の追加

2019/10/06 11:21

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -68,4 +68,25 @@
68
68
  p には v[9] のアドレスが入ります。
69
69
  *p = c; により、v[9] に 'H' が入ります。
70
70
 
71
- そして、main に戻ります。
71
+ そして、main に戻ります。
72
+
73
+ **追記その2**
74
+ char v[] = ""; でも未定義動作ではないプログラム
75
+ ```C
76
+ #include <stdio.h> // printf
77
+ #include <string.h> // strlen
78
+
79
+ int main(void)
80
+ {
81
+ char v[] = "HelloWorld";
82
+ char *p = v;
83
+ char *q = v + strlen(v);
84
+ printf("v = %s\n", v);
85
+ while (p + 1 < q) {
86
+ char temp = *p;
87
+ *p++ = *--q;
88
+ *q = temp;
89
+ }
90
+ printf("v = %s\n", v);
91
+ }
92
+ ```

2

プログラムの説明を追加

2019/10/06 11:21

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -16,4 +16,56 @@
16
16
  revstr(v, v);
17
17
  printf("v = %s\n", v);
18
18
  }
19
- ```
19
+ ```
20
+ **追記**
21
+
22
+ 3項演算子 ?: を使わずに書くと次のようになります。
23
+ ```C
24
+ #include <stdio.h>
25
+
26
+ char *revstr(char *s, char *p)
27
+ {
28
+ char c = *p;
29
+ if (c != '\0') {
30
+ p = revstr(s, p + 1);
31
+ *p = c;
32
+ return p + 1;
33
+ }
34
+ else
35
+ return s;
36
+ }
37
+
38
+ int main(void)
39
+ {
40
+ char v[11] = "HelloWorld";
41
+ printf("v = %s\n", v);
42
+ revstr(v, v);
43
+ printf("v = %s\n", v);
44
+ }
45
+ ```
46
+ s は変化せず、常に main の v[0] を指すポインタです。
47
+
48
+ p は、関数 revstr の再帰呼出しにより、配列 v の要素を順番に指していきます。
49
+
50
+ 最初に呼び出された revstr の c には 'H' が入ります。
51
+ 2番目に呼び出された revstr の c には 'e' が入ります。
52
+ ...
53
+ 9番目に呼び出された revstr の c には 'l' が入ります。
54
+ 10番目に呼び出された revstr の c には 'd' が入ります。
55
+ 11番目に呼び出された revstr の c には '\0' が入ります。
56
+
57
+ ここで c が '\0' なので、再帰呼出しはせずに、s を返し、
58
+ 10番目に呼び出された revstr に戻ります。
59
+ そこで p には s の値、すなわち v[0] のアドレスが入るので、
60
+ *p = c; により、v[0] に 'd' が入ります。
61
+ そして、p + 1、すなわち v[1] のアドレスを返します。
62
+
63
+ 9番目に呼び出された revstr に戻ると、p に v[1] のアドレスが入ります。
64
+ *p = c; により、v[1] に 'l' が入ります。
65
+ そして、p + 1、すなわち v[1] へのアドレスを返します。
66
+
67
+ これを繰り返して、最初に呼び出された revstr に戻った時
68
+ p には v[9] のアドレスが入ります。
69
+ *p = c; により、v[9] に 'H' が入ります。
70
+
71
+ そして、main に戻ります。

1

再投稿

2019/10/05 02:36

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -1,4 +1,5 @@
1
- 質問への回答でなくて申し訳ありませんが、ポインタを使った文字列の反転です。
1
+ 質問への回答でなくて申し訳ありませんが、
2
+ ポインタを使った文字列の反転です。
2
3
  ```C
3
4
  #include <stdio.h>
4
5