C++ 如何使用strncpy\s复制字符数组

C++ 如何使用strncpy\s复制字符数组,c++,C++,我目前正在尝试将一个字符数组复制到缓冲区(也是一个char数组,但大小更大)。我使用strncpy\u来实现这一点,这非常简单。然而,结果并不是我所期望的。这是密码 int r = strncpy_s(lOutMessage.messageBuffer+1, 4, lIndexChar, 4); // lIndexChar is an array of char with size 4, 1, 0, 0, 0 (char converted to int) -> char lIndexCh

我目前正在尝试将一个字符数组复制到缓冲区(也是一个
char
数组,但大小更大)。我使用
strncpy\u
来实现这一点,这非常简单。然而,结果并不是我所期望的。这是密码

int r = strncpy_s(lOutMessage.messageBuffer+1, 4, lIndexChar, 4);
// lIndexChar is an array of char with size 4, 1, 0, 0, 0 (char converted to int) -> char lIndexChar[4];
// lOutMessage.messageBuffer is also an array of char -> char messageBuffer[MAX_MESSAGE_SIZE];
我希望
1,0,0,0
值被复制到缓冲区。但是,只有前两个复制正确。复制值后的结果是
1,0,-2,-2
。我不知道它是怎么变成-2的。知道为什么会这样吗?有什么解决方案吗?

您将“字符数组”视为C字符串。也就是说,缓冲区在逻辑上以空终止符结尾(即使它在物理上可能包含更多的尾随字节)

但它不是一个。它是包含任意值(包括零)的缓冲区

strncpy
和friends处理C字符串,通常在零值处停止(即空终止符)。事实上,
strncpy

将由
src
指向的字符数组(包括终止的空字符,但不包括空字符后面的任何字符)的
count
字符复制到由
dest
指向的字符数组

因此,目标数组的剩余字节保持不变,因此您可能看到读取未初始化(因此未指定)值的结果。至少,它们是你以前留下的价值观

你可能想要:

…或者它的C朋友,如果你感到年老和不安全。(这将是您当前方法的直接非字符串模拟。)


我使用strncpy_来做这件事,这很简单


通常,如果您正在使用的函数没有执行您希望它执行的操作,请在文档中查找它,以确保它执行您认为它执行的操作。也许这并不像你想象的那么简单。

你应该创建一个MRE:请提供一个。我们没有足够的时间继续下去。我没有办法,但请考虑使用<代码> STD::String 如果问题和原因都完全清楚,伙计们。对不起,这是我的第一篇文章。还是不习惯规则。问题解决了。谢谢。这解决了我的问题。谢谢。我真的不知道如果有std::copy做同样的事情,他们为什么要放strncpy(?)@Jostimanatarigan谁是“他们”?你是说语言设计师吗?这是因为它们是不同的函数,可以做不同的事情,它们都有不同的用途,这取决于您尝试做什么。只是,今天,
strncpy
不是适合您工作的工具。从什么时候开始,
strncpy()
处理以null结尾的字符串,而不是包含零填充字符串的固定长度缓冲区?@Deduplicator两者之间的区别是什么?至少在这种情况下。
strncpy
既不假设源以null结尾,也不保证目标以null结尾。相反,它保证将其填充为null,无论这意味着n个或0个null字符,这通常看起来像极为低效的null终止,但有时并非如此。因此,
strncpy
不是一个以null结尾的字符串函数,它和
strncpy\u s
充其量是假朋友。
std::copy(lIndexChar, lIndexChar+4, lOutMessage.messageBuffer+1);