类型转换遇到’\0’中断
在编写项目的时候,可能会遇到字符串中含有'\0'
,进行类型转换或者是输出的时候,就会出现'\0'
后面的内容没有转换到或输出,只转换或输出了一部分字符串,比如:
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
unsigned char arr[] = {"hello\0world!"};
char* arr_c = (char*)arr;
int arrLen = sizeof(arr);
int arr_cLen = (int)(strlen(arr_c));
cout<<"arrLen:"<<arrLen<<endl; // 13
cout<<"arr_cLen:"<<arr_cLen<<endl; // 5
cout<<"arr:"<<arr<<endl; // hello
cout<<"arr_c:"<<arr_c<<endl; // hello
return 0;
}
原本的字符串长度是13,但是经过类型转换的时候,遇到'\0'
导致后面的没有进行转换。且在输出的时候,遇到'\0'
导致后面的内容没有输出出去。我们可以通过观察内存来看类型转换后,到底拷贝了哪些内存:
这是原数组,我们可以通过右边得知,这个字符数组长度为13,以及在内存中的位置。
这是经过类型转换后的指针指向的数组,我们可以看到arr_c
长度只有5,这是由于在类型转换的时候,遇到'\0'
,所以后面的就没有再进行转换了。
注意:此处我们是通过指针进行操作的,所以两个指针指向同一块内存,但是指针的类型有所不同,所以最终类型有所不同。
解决方式
- 比如此处的
unsigned char[]
转char[]
,我们可以通过拷贝指定长度内存的方式
unsigned char arr[] = {"hello\0world!"};
int arrLen = sizeof(arr);
char arr_c[arrLen];
memcpy(arr_c, arr, arrLen );
可以看到,我们将arr
中所有的内容都拷贝下来了。
- 再比如
char[]
转string
,同样的存在此问题,此时可以通过调用指定长度的那个构造函数来进行转换:
char arr[] = {"hello\0world!"};
int arrLen = sizeof(arr);
string(arr, arrLen);
如此就达成了遇到'\0'
不中断的目的。