如何复制包含'\ 0'字符的数据

时间:2014-09-30 10:45:01

标签: c++ char strcpy

我正在尝试复制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;
}

结果在这里: enter image description here

我不明白我的代码有什么问题。

提前感谢您的帮助。

6 个答案:

答案 0 :(得分:1)

my_strcpychar*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);

Test

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'作为字符串终止符