我正在尝试复制conatin'\ 0'的数据。我正在使用C ++。 当研究结果为否定时,我决定编写自己的函数来将数据从一个char *复制到另一个char *。但它不会返回想要的结果! 我的尝试如下:
#include <iostream>
char* my_strcpy( char* arr_out, char* arr_in, int bloc )
{
char* pc= arr_out;
for(size_t i=0;i<bloc;++i)
{
*arr_out++ = *arr_in++ ;
}
*arr_out = '\0';
return pc;
}
int main()
{
char * out= new char[20];
my_strcpy(out,"12345aa\0aaaaa AA",20);
std::cout<<"output data: "<< out << std::endl;
std::cout<< "the length of my output data: " << strlen(out)<<std::endl;
system("pause");
return 0;
}
结果在这里:
我不明白我的代码有什么问题。
提前感谢您的帮助。
答案 0 :(得分:1)
当my_strcpy
写char*
至cout
或使用strlen
计算\0
时,memcpy
工作正常char
1}} 根据C字符串行为。顺便说一句,无论\0
如何,您都可以使用{{1}}复制{{1}}块。
答案 1 :(得分:1)
如果您知道&#39;字符串的长度&#39;然后使用memcpy。当strcpy遇到字符串终止符\ 0时,它将暂停其副本。 Memcpy不会,它会复制\ 0及其后的任何内容。
答案 2 :(得分:1)
(注意:对于那些不知道\0
是C和C ++中字符串文字中值为零的单字符字节的读者,不要与\\0
表达式混淆导致实际反斜杠的两个字节序列后跟字符串中的实际零...我将引导您Dr. Rebmu's explanation of how to split a string in C以进一步误传。)
C ++字符串可以独立于任何嵌入的\0
来保持其长度。他们根据这个长度复制他们的内容。唯一的一点是默认构造函数,当用C字符串初始化并且没有长度时,将由null终止符指导您想要的长度。
要覆盖它,您可以显式传入长度。但要确保长度准确。您有17个字节的数据,如果您希望字符串文字中的空终止符作为数据的一部分进入字符串,则为18个字节。
#include <iostream>
using namespace std;
int main() {
string str ("12345aa\0aaaaa AA", 18);
string str2 = str;
cout << str;
cout << str2;
return 0;
}
(如果你可以避免,请尽量不要对这些长度进行硬编码。请注意,你没有对它进行正确计算,当我在这里纠正另一个答案时,他们也错了。它已经错了。\ n&#39; s容易出错。)
在我的终端输出:
12345aaaaaaa AA
12345aaaaaaa AA
但请注意,您在此处所做的实际上是将0字节流式传输到标准输出。我不确定不同终端标准的行为是如何正式处理的。超出可打印范围的东西可用于各种用途,具体取决于您正在运行的终端类型...将光标定位在屏幕上,更改颜色等。我不会写出来除非我知道接收它们的流上的语义是什么,否则这些字符串会嵌入零。
考虑一下,如果你正在处理的是字节,不要混淆问题和使用std::vector<char>
。许多图书馆提供了替代方案,例如Qt&#39; QByteArray
答案 3 :(得分:0)
你的功能很好(除了你应该传递给它17
而不是20
)。如果需要输出空字符,一种方法是将数据转换为std::string
:
std::string outStr(out, out + 17);
std::cout<< "output data: "<< outStr << std::endl;
std::cout<< "the length of my output data: " << outStr.length() <<std::endl;
答案 4 :(得分:0)
我不明白我的代码有什么问题。
my_strcpy(out,&#34; 12345aa \ 0aaaaa AA&#34;,20);
您的字符串包含字符&#39; \&#39;这被解释为escape sequence。为防止这种情况,您必须复制反斜杠:
my_strcpy(out,"12345aa\\0aaaaa AA",20);
output data: 12345aa\0aaaaa AA
the length of my output data: 18
答案 5 :(得分:-1)
你的字符串已在中途终止。
my_strcpy(out,"12345aa\0aaaaa AA",20);
为什么你打算在这之间拥有\ 0?如果你愿意的话,还有其他一些分隔符 否则,由于std :: cout和strlen将\ 0解释为字符串终止符,因此会出现意外情况。 我的意思是遵循惯例,即'\ 0'作为字符串终止符