gpt4 book ai didi

c++ - Memcpy、字符串和终止符

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:54:32 25 4
gpt4 key购买 nike

我必须编写一个函数,用字符串的内容填充指定长度的 char* 缓冲区。如果绳子太长,我只需要剪掉它。缓冲区不是由我分配的,而是由我的函数的用户分配的。我试过这样的事情:

int writebuff(char* buffer, int length){
string text="123456789012345";
memcpy(buffer, text.c_str(),length);
//buffer[length]='\0';
return 1;
}


int main(){
char* buffer = new char[10];
writebuff(buffer,10);
cout << "After: "<<buffer<<endl;
}

我的问题是关于终结符:它应该存在还是不存在?这个函数用在更广泛的代码中,有时当需要剪切字符串时,我似乎遇到了奇怪字符的问题。

关于要遵循的正确程序有什么提示吗?

最佳答案

C 风格的字符串必须以零字符'\0' 结束。

此外,您的代码还有另一个问题 - 它可能会尝试从源字符串末尾之外进行复制。这是典型的未定义行为。它可能看起来有效,直到有一次字符串被分配到堆内存块的末尾并且拷贝进入内存的 protected 区域并且失败了。您应该只复制到缓冲区长度或字符串长度的最小值

附言为了完整起见,这里有一个很好的函数版本。感谢 Naveen 指出终止空值中的差一错误。我冒昧地使用您的返回值来指示返回字符串的长度,或者如果传入的长度为 <= 0 则需要的字符数。

int writebuff(char* buffer, int length)
{
string text="123456789012345";
if (length <= 0)
return text.size();
if (text.size() < length)
{
memcpy(buffer, text.c_str(), text.size()+1);
return text.size();
}
memcpy(buffer, text.c_str(), length-1);
buffer[length-1]='\0';
return length-1;
}

关于c++ - Memcpy、字符串和终止符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5952512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com