我试图用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) << ")";
}在这里 (G++4.9.2)编译的代码。
输出不包含32个字符(正在添加垃圾值):
Lorem ipsum dolor sit amet, cons †¿(36)在这里 (G++4.9)编译的代码。
产出包含所需的结果:
Lorem ipsum dolor sit amet, cons(32)我的机器上的输出类似于第一个输出(36个字符)。
为什么每个结果是不同的?
,什么是memcpy的有效用法来复制n个字符?
发布于 2016-04-15 10:24:41
strlen函数和operator<< (const char *)函数只适用于C型字符串.它们不能用于输出或测量任意数据块的长度。
想想看--他们怎么可能决定长度呢?他们可以用什么方法呢?
为什么每个结果是不同的?
因为您使用的函数只能用于C样式的字符串,而不是C样式的字符串。这是一个错误,根据平台内存布局的具体情况,它的行为将有所不同。
如何有效地使用memcpy来复制n个字符?
就这样。你抄袭了角色。但现在你只有一堆字符,没有字符串。如果您使用打印字符束的函数,它们会工作得很好。
试试这个:
#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];
}发布于 2016-04-15 10:28:14
dest不是以空结尾的.因此,像strlen或operator <<这样的函数不知道它们已经到达缓冲区的末尾,即使在到达32个字符之后也会继续。当在dest[31]之后的未知内存中遇到null时,它们将停止,这可能是在10,1000,1000000字节之后,甚至根本没有。你需要的是:
#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[33];
std::memcpy(&dest, source, sizeof(dest)-1);
dest[32] = '\0';
std::cout << dest << "(" << strlen(dest) << ")";
}发布于 2016-04-15 10:29:57
您可以使用std::string
#include <iostream>
#include <string>
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.";
std::string s(source, 32);
std::cout << s << "(" << s.length() << ")";
}对于memcpy,通常不希望在c样式的字符串上使用它,因为字符串的长度是内存块的大小减去1。
https://stackoverflow.com/questions/36644523
复制相似问题