我必须编写一个函数,用字符串的内容填充指定长度的 char* 缓冲区。如果绳子太长,我只需要剪掉它。缓冲区不是由我分配的,而是由我的函数的用户分配的。我尝试了这样的事情:
int writebuff(char* buffer, int length){
string text="123456789012345";
memcpy(buffer, text.c_str(),length);
//buffer[length]=' ';
return 1;
}
int main(){
char* buffer = new char[10];
writebuff(buffer,10);
cout << "After: "<<buffer<<endl;
}
我的问题是关于终结者的:它应该存在还是不存在?这个函数用于更广泛的代码中,有时当需要剪切字符串时,我似乎会遇到奇怪的字符问题。
关于要遵循的正确程序的任何提示?
C 样式字符串必须以零字符结尾 ' '
。
此外,您的代码还有另一个问题 - 它可能会尝试从源字符串的末尾进行复制。这是典型的未定义行为。它可能看起来像是有效的,直到在堆内存块的末尾分配字符串并且副本进入内存的受保护区域并发生惊人的失败。应仅复制缓冲区长度或字符串长度的最小值。
附言为了完整起见,这里有一个很好的函数版本。感谢 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]=' ';
return length-1;
}
如果要将缓冲区视为字符串,则应以 NULL 终止它。为此,您需要使用 memcpy
复制length-1
字符并将length-1
字符设置为