首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用memcpy复制n个字符

使用memcpy复制n个字符
EN

Stack Overflow用户
提问于 2016-04-15 10:21:58
回答 5查看 4.2K关注 0票数 0

我试图用memcpy复制32个字符的确切数量,但是由于多个在线g++编译器和我的机器上的编译器在相同的源代码中给出的结果略有不同,所以我在正确使用它时遇到了问题。

代码:

代码语言:javascript
复制
#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个字符(正在添加垃圾值):

代码语言:javascript
复制
Lorem ipsum dolor sit amet, cons †¿(36)

这里 (G++4.9)编译的代码。

产出包含所需的结果:

代码语言:javascript
复制
Lorem ipsum dolor sit amet, cons(32)

我的机器上的输出类似于第一个输出(36个字符)。

为什么每个结果是不同的?

,什么是memcpy的有效用法来复制n个字符?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-04-15 10:24:41

strlen函数和operator<< (const char *)函数只适用于C型字符串.它们不能用于输出或测量任意数据块的长度。

想想看--他们怎么可能决定长度呢?他们可以用什么方法呢?

为什么每个结果是不同的?

因为您使用的函数只能用于C样式的字符串,而不是C样式的字符串。这是一个错误,根据平台内存布局的具体情况,它的行为将有所不同。

如何有效地使用memcpy来复制n个字符?

就这样。你抄袭了角色。但现在你只有一堆字符,没有字符串。如果您使用打印字符束的函数,它们会工作得很好。

试试这个:

代码语言:javascript
复制
#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];
}
票数 4
EN

Stack Overflow用户

发布于 2016-04-15 10:28:14

dest不是以空结尾的.因此,像strlenoperator <<这样的函数不知道它们已经到达缓冲区的末尾,即使在到达32个字符之后也会继续。当在dest[31]之后的未知内存中遇到null时,它们将停止,这可能是在10,1000,1000000字节之后,甚至根本没有。你需要的是:

代码语言:javascript
复制
#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) << ")";
}
票数 3
EN

Stack Overflow用户

发布于 2016-04-15 10:29:57

您可以使用std::string

代码语言:javascript
复制
#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。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36644523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档