C++-json(2)-unsigned char-unsigned char*-memcpy-strcpy-sizeof-strlen

news/2024/12/23 6:39:04/

1.类型转换:

//1.赋值一个不知道长度的字符串unsigned char s[] = "kobe8llJfFwFSPiy";                 //1.用一个字符串初始化变量
unsigned int s_length = strlen((char*)s);               //2.获取字符串长度//2.字符串里有双引号"" 需要加\   长度数据类型:size_t
const  unsigned char sjson[] = "{\"name\":\"MABMEC3F8\", \"value\" : \"W6tvvyYEF7ZkFH8V\" }"; 
size_t sjson_length = strlen((char*)sjson);//3.两个 unsigned char*之间的拷贝:unsigned char* pSrc, unsigned char* pDestunsigned char* pSrc="ABC123";
size_t npSrclen =strlen((char*)pSrc);
unsigned char* pDest=new unsigned char[npSrclen];
memcpy(pDest, pSrc, npSrclen);

//1.static_cast      相近类型#include<iostream>
using namespace std;int main()
{double d = 12.34;int a = static_cast<int>(d);return 0;
}//2.reinterpret_cast 不相关类型
typedef void(*FUNC) ();int DoSomething(int i)
{cout << "DoSomething" << endl;return 0;
}
int main()
{
//reinterpret_cast可以让编译器以FUNC的定义方式去看待DoSomething函数
//所以非常的BUG,下面的转换函数指针的代码时不可移植的,所以不建议使用
//C++不保证所有的函数指针都被一样使用,所以这样用有时会产生不确定的结果FUNC f = reinterpret_cast<FUNC>(DoSomething);f();system("pause");return 0;
}//3.const_cast  删除变量的const属性
int main()
{volatile const int a = 2;int* p = const_cast<int*>(&a);*p = 3;cout << a << endl;system("pause");return 0;
}//4.explicit关键字阻止转换构造函数进行的隐式类型转换的发生
class A
{
public:explicit A(int a){cout << "A(int a)" << endl;}A(const A* a){cout << "const A* a" << endl;}
private:int _a;
};
int main()
{A a1(1);  //隐式转换--A tmp(1); A a2(tmp)A a2 = 1;system("pause");return 0;
}

int main()
{unsigned char data[] = {0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x57, 0x6F, 0x72, 0x6C, 0x64};int len = sizeof(data) / sizeof(unsigned char);string str(data, data+len);return 0;
}

3.  拷贝 一定要new 

    错误的:

//1. 不new
unsigned char* pSrc1 = (unsigned char*)(s_data_offset_.c_str());
int  Srclen1 = strlen((char*)pSrc1);
unsigned char pcopy1[] = { 0 };      
memcpy(pcopy1, pSrc1, Srclen1 );      //debug 显示字符串中的字符无效  
int  copy1len = strlen((char*)pcopy1); //长度   24个  0x18  //3.去掉后面的字符串unsigned char*  pcopy3 = mytrim(pcopy2, Srclen2);size_t copy3len = strlen((char*)pcopy3);

正确的:

//2.new  
unsigned char* pSrc2 = (unsigned char*)(s_data_offset_.c_str());
int Srclen2 = strlen((char*)pSrc2);
unsigned char* pcopy2 = new unsigned char[Srclen2];  //长度  
memcpy(pcopy2, pSrc2, Srclen2 );                     //pcopy2 显示 pSrc中的字符
size_t copy2len = strlen((char*)pcopy2);


 

4.copy 出来的是有空字符串的
            去掉空字符串

 //3.去掉  原始的是16-实际的是21 相差5个//字符串去空格
unsigned char* mytrim(unsigned char* pSrc, int pSrcLen)
{unsigned char* copy = (unsigned char*)malloc(pSrcLen);memset(copy, 0, pSrcLen);unsigned int i = 0, j = 0;for (i = 0; i < pSrcLen; i++){if (pSrc[i] != ' '){copy[j++] = pSrc[i];}}copy[j] = '\0';int  strCopy2len = strlen((char*)copy);return copy;
}

5.数据长度 最后一个字符一定要是'\0'

strlen() 只有遇到'\0'才会停止计算,同时计算的长度不包含'\0',否则就是个随机值

#include <stdio.h>
#include <string.h>//当计算长度时,只有遇到'\0'才会停止计算,同时计算的长度不包含'\0'。
int main()
{char arr[10] = "abcde";int num = strlen(arr);printf("数组arr的长度为:%d\n", num);        //数据长度为5return 0;
}int main()
{char arr[] = { 'a','b','c','d','e' };int num = strlen(arr);printf("数组arr的长度:%d\n", num);         //数据长度为 19 此处返回的是一个随机值return 0;
}

sizeof

#include <stdio.h>
#include <string.h>//字符串长度默认+1   最后一个 "\0"
int main()
{unsigned char  arr1[] = "abcde";int num1 = sizeof(arr1);printf("数组arr1的长度为:%d\n", num1);        //数据长度为6unsigned char arr2[] = { 'a','b','c','d','e' };int num2 = sizeof(arr2);printf("数组arr2的长度:%d\n", num2);         //数据长度为5 return 0;
}


对于  unsigned char* p     长度用 strlen((char*) p)
对于  unsigned char arr[]  长度用 sizeof(arr) 

6.memcpy和strcpy

 1.strcpy仅仅只能复制字符串,但是memcpy却可以复制所有的类型。
 2.strcpy复制字符串的时候,什么时候结束是依赖于source处字符串的’\0’来决定的。但是memcpy复制的时候,复制多少个字节是采用第三个参数来决定的。


 

int main()
{char data[256];memcpy(data, "12345", 5);cout << data << endl;strcpy(data, "6789");cout << data << endl;return 0;
}

1. data 初始化为0                    memset(data,0,256);
2. memcpy时把最后一个\0 复制过去  memcpy(data,"12345",6);
 


http://www.ppmy.cn/news/1167617.html

相关文章

​蔚来自动驾驶,从 2020 年开始讲起的故事

2020 年底&#xff0c;摆脱 2019 年阴霾的李斌先生&#xff0c;热情而兴奋&#xff0c;再一次说&#xff1a;「欢迎来到蔚来日。」 那天蔚来发布了令人咋舌的智能驾驶硬件系统&#xff0c;4 块当时甚至还没有宣布量产日期的 Orin 芯片&#xff0c;11 路高清摄像头。 早在 ET7…

windows编译zlmediakit

开发环境搭建 使用visual studio 2022 打开360软件管家 &#xff0c;选择宝库&#xff0c;输入2022 点击安装 选择下图中的选择项目进行安装&#xff0c;安装路径可以修改为d盘 等待安装完成 打开源码进行编译 双击打开 选择打开文件夹 选择代码文件夹 配置如下&#xff…

2023年9月青少年软件编程(C 语言) 等级考试试卷(七级)

青少年软件编程&#xff08;C/C&#xff09;7级等级考试真题试卷&#xff08;2023年9月&#xff09; 编程题第 1 题 红与黑&#xff08;2023.9&#xff09; 有一间长方形的房子&#xff0c;地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上&#xff0c…

Windows11突然VM虚拟机无法运行报错与 Device/Credential Guard 不兼容

windows11长时间没用vmware,突然使用时打开报一下错&#xff1a; 解决方案&#xff1a; 以管理员身份运行“Windows Powershell (管理员)”&#xff08;Windows键X键&#xff09;&#xff0c;输入以下命令重启电脑。 bcdedit /set hypervisorlaunchtype off 注意&#xff1a…

Excel·VBA单元格区域数据对比差异标记颜色

之前的一篇博客《ExcelVBA单元格重复值标记颜色》&#xff0c;是对重复的整行标记颜色 而本文是按行对比2个单元格区域的数据&#xff0c;并对有差异的区域&#xff08;一个单元格区域有的&#xff0c;而另一个单元格区域没有的&#xff09;标记颜色&#xff0c;且只要存在任意…

医疗领域的数字化浪潮:互联网医院平台的关键作用

数字化浪潮正在迅速改变医疗领域的方式和效率。互联网医院平台作为数字化医疗的关键元素&#xff0c;正在为医疗行业带来巨大的变革。本文将探讨互联网医院平台的关键作用&#xff0c;并提供一个示例&#xff0c;使用Python编写一个简单的医疗预约系统。 互联网医院平台的关键…

PTrade财务数据获取函数的问题

前文介绍了PTrade的get_fundamentals函数&#xff0c;可以用于获取股票的财务数据。但在实际应用中&#xff0c;会遇到如下的问题。 前文我们通过将回测时间设置为2023-05-05进行回测调用get_fundamentals&#xff0c;得到如下查询结果&#xff1a; secu_codepubl_dateend_da…

Retrofit+Flow网络请求与Android网络请求的演变

Retrofit网络请求我想大家都不陌生&#xff0c;今天我就来梳理一下技术是如何一步一步进步&#xff0c;逼格是如何一步一步变高的。 Retrofit使用方式演变 萌新 刚开始接触Retrofit的时候是从okhttp和volley以及android系统源码里面那个HttpPost与HttpGet切换过来的。 publ…