回答編集履歴

2

修正

2021/02/28 23:27

投稿

thkana
thkana

スコア7652

test CHANGED
@@ -32,14 +32,14 @@
32
32
 
33
33
 
34
34
 
35
+ これは別の問題。main側の
36
+
35
- これは別の問題。strcpy_s(あるいはstrncpy)の仕様を確認してください。指定数よりコピー元文字列が長かった場合どうなるか、大抵の場合明確に注意がかいてあると思います。
37
+ ` memcpy(cStringDst, cStringSrc, _BUF_SIZE);`
38
+
39
+ の動作から導かれるものです。
36
40
 
37
41
 
38
42
 
39
- lpStringを「文字列」として成立させたいのなら、成立するようにプログラム側で打たないいけせまん
43
+ lpStringを「文字列」として成立させたいのなら、成立するようにmain側のプログラム側で渡す文字列ちゃん作ってやるのでしょう
40
44
 
41
- 簡単には`lpString[_BUF_SIZE-1]='\0';`としておくとか。
45
+ 簡単には`cStringDst[_BUF_SIZE-1]='\0';`としておくとか。
42
-
43
-
44
-
45
- (そもそもlpStringは関数の外に持ち出せないので何をしたいの? という問題はあるけれど)

1

追記

2021/02/28 23:27

投稿

thkana
thkana

スコア7652

test CHANGED
@@ -21,3 +21,25 @@
21
21
  それを防ぐには、lpStringの先頭から_BUF_SIZE文字以内に'\0'があるかどうかを順次調べるとかいうことになるでしょうか。
22
22
 
23
23
  それでも、呼ぶ側でlpStringに渡す配列のサイズが_BUF_SIZE未満であればやはり未定義動作になりますが、これは呼ばれた側では如何ともし難いので呼び出し側で大丈夫なように担保してもらうしかないです。
24
+
25
+
26
+
27
+ ---
28
+
29
+ (追記)
30
+
31
+ > lpStringをデバッガで見ると"12345678フフフフフフフフ1234567890"となっています。
32
+
33
+
34
+
35
+ これは別の問題。strcpy_s(あるいはstrncpy)の仕様を確認してください。指定数よりコピー元文字列が長かった場合どうなるか、大抵の場合明確に注意がかいてあると思います。
36
+
37
+
38
+
39
+ lpStringを「文字列」として成立させたいのなら、成立するようにプログラム側で手を打たないといけせまん。
40
+
41
+ 簡単には`lpString[_BUF_SIZE-1]='\0';`としておくとか。
42
+
43
+
44
+
45
+ (そもそもlpStringは関数の外に持ち出せないので何をしたいの? という問題はあるけれど)