类型转换中遇到‘\0‘如何不中断

类型转换遇到’\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'不中断的目的。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值