回答編集履歴

3

別解の追加

2019/10/06 11:21

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -139,3 +139,45 @@
139
139
 
140
140
 
141
141
  そして、main に戻ります。
142
+
143
+
144
+
145
+ **追記その2**
146
+
147
+ char v[] = ""; でも未定義動作ではないプログラム
148
+
149
+ ```C
150
+
151
+ #include <stdio.h> // printf
152
+
153
+ #include <string.h> // strlen
154
+
155
+
156
+
157
+ int main(void)
158
+
159
+ {
160
+
161
+ char v[] = "HelloWorld";
162
+
163
+ char *p = v;
164
+
165
+ char *q = v + strlen(v);
166
+
167
+ printf("v = %s\n", v);
168
+
169
+ while (p + 1 < q) {
170
+
171
+ char temp = *p;
172
+
173
+ *p++ = *--q;
174
+
175
+ *q = temp;
176
+
177
+ }
178
+
179
+ printf("v = %s\n", v);
180
+
181
+ }
182
+
183
+ ```

2

プログラムの説明を追加

2019/10/06 11:21

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -35,3 +35,107 @@
35
35
  }
36
36
 
37
37
  ```
38
+
39
+ **追記**
40
+
41
+
42
+
43
+ 3項演算子 ?: を使わずに書くと次のようになります。
44
+
45
+ ```C
46
+
47
+ #include <stdio.h>
48
+
49
+
50
+
51
+ char *revstr(char *s, char *p)
52
+
53
+ {
54
+
55
+ char c = *p;
56
+
57
+ if (c != '\0') {
58
+
59
+ p = revstr(s, p + 1);
60
+
61
+ *p = c;
62
+
63
+ return p + 1;
64
+
65
+ }
66
+
67
+ else
68
+
69
+ return s;
70
+
71
+ }
72
+
73
+
74
+
75
+ int main(void)
76
+
77
+ {
78
+
79
+ char v[11] = "HelloWorld";
80
+
81
+ printf("v = %s\n", v);
82
+
83
+ revstr(v, v);
84
+
85
+ printf("v = %s\n", v);
86
+
87
+ }
88
+
89
+ ```
90
+
91
+ s は変化せず、常に main の v[0] を指すポインタです。
92
+
93
+
94
+
95
+ p は、関数 revstr の再帰呼出しにより、配列 v の要素を順番に指していきます。
96
+
97
+
98
+
99
+ 最初に呼び出された revstr の c には 'H' が入ります。
100
+
101
+ 2番目に呼び出された revstr の c には 'e' が入ります。
102
+
103
+ ...
104
+
105
+ 9番目に呼び出された revstr の c には 'l' が入ります。
106
+
107
+ 10番目に呼び出された revstr の c には 'd' が入ります。
108
+
109
+ 11番目に呼び出された revstr の c には '\0' が入ります。
110
+
111
+
112
+
113
+ ここで c が '\0' なので、再帰呼出しはせずに、s を返し、
114
+
115
+ 10番目に呼び出された revstr に戻ります。
116
+
117
+ そこで p には s の値、すなわち v[0] のアドレスが入るので、
118
+
119
+ *p = c; により、v[0] に 'd' が入ります。
120
+
121
+ そして、p + 1、すなわち v[1] のアドレスを返します。
122
+
123
+
124
+
125
+ 9番目に呼び出された revstr に戻ると、p に v[1] のアドレスが入ります。
126
+
127
+ *p = c; により、v[1] に 'l' が入ります。
128
+
129
+ そして、p + 1、すなわち v[1] へのアドレスを返します。
130
+
131
+
132
+
133
+ これを繰り返して、最初に呼び出された revstr に戻った時
134
+
135
+ p には v[9] のアドレスが入ります。
136
+
137
+ *p = c; により、v[9] に 'H' が入ります。
138
+
139
+
140
+
141
+ そして、main に戻ります。

1

再投稿

2019/10/05 02:36

投稿

kazuma-s
kazuma-s

スコア8224

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