我正在尝试使用 memcpy 复制 32 个字符的确切数量,但是我在正确使用它时遇到了问题,因为多个在线 g++ 编译器以及我机器上的编译器使用相同的源代码给出的结果略有不同代码。
代码:
#include <iostream>
#include <cstring>
int main()
{
const char* source = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec eu ipsum nec elit mattis consequat. Curabitur sollicitudin ligula et quam bibendum euismod.";
char dest[32];
std::memcpy(&dest, source, sizeof(dest));
std::cout << dest << "(" << strlen(dest) << ")";
}
代码编译于here (G++4.9.2).
输出不包含 32 个字符(正在添加垃圾值):
Lorem ipsum dolor sit amet, cons †¿(36)
代码编译于here (G++4.9).
输出包含必需的结果:
Lorem ipsum dolor sit amet, cons(32)
我机器上的输出类似于第一个输出(36 个字符)。
为什么每个结果都不一样?
复制 n 个字符的 memcpy 的有效用法应该是什么?
最佳答案
strlen
函数和 operator<< (const char *)
函数只适用于 C 风格的字符串。它们不能用于输出或测量任意数据 block 的长度。
想一想——他们怎么可能确定长度?他们可能使用什么方法?
Why is each result different?
因为您使用的函数只能用于非 C 风格字符串的 C 风格字符串。这是一个根据平台内存布局的具体情况而表现不同的错误。
What should be the valid usage of memcpy to copy n numbers of characters?
就是这样。你复制了字符。但是现在你只有一堆字符,而不是字符串。如果您使用打印字符束的函数,它们会正常工作。
试试这个:
#include <iostream>
#include <cstring>
int main()
{
const char* source = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec eu ipsum nec elit mat
char dest[32];
std::memcpy(&dest, source, sizeof(dest));
for (int i = 0; i < sizeof(dest); ++i)
std::cout << dest[i];
}
关于c++ - 使用 memcpy 复制 n 个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36644523/