回答編集履歴
2
追記2
answer
CHANGED
@@ -11,4 +11,15 @@
|
|
11
11
|
i は 5 ですが、`i++;` で i は 6 になります。
|
12
12
|
d は s1[6] を指しています。
|
13
13
|
forループで、d[i] は s1[12] です。
|
14
|
-
そこに '\0' を入れることで、配列の範囲外の領域を破壊します。
|
14
|
+
そこに '\0' を入れることで、配列の範囲外の領域を破壊します。
|
15
|
+
|
16
|
+
**追記2**
|
17
|
+
strncpy は、このようにも書けます。
|
18
|
+
```C
|
19
|
+
char *strncpy(char *d, const char *s, size_t n)
|
20
|
+
{
|
21
|
+
for (size_t i = 0; i < n; i++)
|
22
|
+
if (d[i] = *s) s++;
|
23
|
+
return d;
|
24
|
+
}
|
25
|
+
```
|
1
追記
answer
CHANGED
@@ -1,2 +1,14 @@
|
|
1
1
|
`d[i] = '\0';` で s1[10]以降に '\0' を入れています。
|
2
|
-
やいたいことは `*d++ = '\0';` ではありませんか?
|
2
|
+
やいたいことは `*d++ = '\0';` ではありませんか?
|
3
|
+
|
4
|
+
**追記**
|
5
|
+
変数の変化をちゃんと見ましょう。
|
6
|
+
|
7
|
+
`strncpy(s1, "12345", 7);` で呼び出したとき、
|
8
|
+
d は s1[0] を指しています。
|
9
|
+
whileループが終了した時点で、
|
10
|
+
s1[0] = '1'、s1[1] = '2'、...、s1[5] = '\0' で、
|
11
|
+
i は 5 ですが、`i++;` で i は 6 になります。
|
12
|
+
d は s1[6] を指しています。
|
13
|
+
forループで、d[i] は s1[12] です。
|
14
|
+
そこに '\0' を入れることで、配列の範囲外の領域を破壊します。
|