C/C++类型转换

强制类型转换、使用函数转换与memcpy

如果一个int型的变量值为5,则若使用强制类型转换或者使用memcpy,则相当于直接copy内存中的值,若打印,则会打印5对应的ASCII值;而若使用函数转换,则函数会操作内存转为ASCII值的5,若打印,则直接为5

memcpy在一定程度上相当于强制类型转换,但是可以制定拷贝的字节大小,因此可能不会出现丢失数据,如大于256的时候,int强制转char,复制低8位给char,其余舍弃

例如:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


// 不足4个字节的前面补零
void int2char(int number, char* result, int length_send)
{
    char str[20];
    sprintf(str,"%4d",number); // 格式化输出int到str字符串

    int i;
    for(i=0;i<length_send;++i)
        if(str[i]==' ')
            str[i]=' ';
    strcpy(result,str); // result 此时只有2个char的大小,但是仍然可以copy4个字节给他
}


// memcpy在一定程度上相当于强制类型转换,但是可以制定拷贝的字节大小,因此可能不会出现丢失数据,如大于256的时候,int强制转char。
int main(int argc, char const *argv[])
{
    int num = 97;
    printf("num:%d\n", num);
    printf("\n");


    /**********************************
    强制类型转换与读取
    **********************************/
    char c = (char)num;
    printf("c:%c\n", c);
    printf("read_c:%d\n", (int)c);
    printf("\n");


    /**********************************
    函数类型转换与读取
    **********************************/
    //char *d; //报错,需要声明大小
    char *d = (char*)malloc(sizeof(char)*2);
    //char d[24]; // 也行

    int2char(num, d, 4);  // 使用函数转换,不足4位的前面补零,事实证明此函数废的
    printf("d_string:%s\t%d\n", d, (int)strlen(d));
    int read_d = atoi(d); // 这个d前面补零与补零都可以
    printf("read_d:%d\n", read_d);
    printf("\n");

    char *dd = (char*)malloc(sizeof(char)*2);
    sprintf(dd, "%4d", num); //也行
    printf("compare dd and d:if equal,then 0:%d\n", strcmp(dd,d));
    int read_dd = atoi(dd); // 这个d前面补零与补零都可以解析
    printf("read_dd:d%d\n", read_dd);
    printf("\n");


    /**********************************
    memcpy类型转换与读取
    **********************************/
    char *e = (char*)malloc(sizeof(char)*4);
    //char e[4];
    memcpy(e,&num,sizeof(num)); //相当于强制类型转换
    printf("e:%s\n", e);
    int f;
    memcpy(&f,e,sizeof(e)); //强制类型转换过来
    printf("read_e:%d\n", f);

    return 0;
}

运行结果为

字节数组byte[]与int类型转换

//int --> BYTE[]:
int data = 0xFFFFFFFF;
unsigned char buf[4];
memcpy(buf, &data, sizeof(int));
//BYTE[] --> int :
memcpy(&data, buf, 4);

Char数组转为int类型

对于socket编程,服务端发送的时候,发送的长和宽均为4个字节的char型数组,而总长度为8个字节的char数组,接收和转int类型的代码如下,因为char数组,以\0结尾,所以这里声明大小的时候,需要大于1位。

而将char数组转换int类型,则使用atoi,注意c_str()作用是将string转为char,因此不用加。

例如

char len[9] = {0};
char wid[5] = {0};
char hei[5] = {0};

recv(fd, len, 8, 0);
recv(fd, wid, 4, 0);
recv(fd, hei, 4, 0);
printf("length:%s\nclos:%s\nrows:%s\n", len, wid, hei);

length = atoi(len);
width = atoi(wid); 
height = atoi(hei);

string 与 int 互转

string转int的方式

  1. 采用最原始的string, 然后按照十进制的特点进行算术运算得到int,但是这种方式太麻烦,这里不介绍了。

  2. 采用标准库中atoi函数。对于其他类型也都有相应的标准库函数,比如浮点型atof(),long型atol()等等。

string s = "12"; 
int a = atoi(s.c_str()); 
  1. 采用sstream头文件中定义的字符串流对象来实现转换。
istringstream is("12"); //构造输入字符串流,流的内容初始化为“12”的字符串 
int i; 
is >> i; //从is流中读入一个int整数存入i中`

int转string的方式

  1. 采用标准库中的to_string函数。
int i = 12; 
cout << std::to_string(i) << endl;` 

不需要包含任何头文件,应该是在utility中,但无需包含,直接使用,还定义任何其他内置类型转为string的重载函数,很方便。

  1. 采用sstream中定义的字符串流对象来实现。
ostringstream os; //构造一个输出字符串流,流内容为空 
int i = 12; 
os << i; //向输出字符串流中输出int整数i的内容 
cout << os.str() << endl; //利用字符串流的str函数获取流中的内容

字符串流对象的str函数对于istringstream和ostringstream都适用,都可以获取流中的内容。

string转char

string s = "12";
s.c_str()

const char*char* 之间的转换

const char*是指向常量的指针,而不是指针本身为常量,可以不被初始化.该指针可以指向常量也可以指向变量,只是从该指针的角度而言,它所指向的是常量,通过该指针不能修改它所指向的数据.

const char*转为char*

const char*是不能直接赋值到char*的,这样编译都不能通过,理由:假如可以的话,那么通过char*就可以修改const char指向的内容了,这是不允许的.所以char*要另外开辟新的空间。

#include <iostream>
using namespace std;
void main(){
 const char* cpc="abcde";
 char* pc=new char[100];
 strcpy(pc,cpc);
 cout<<pc<<endl;
}

char*转为const char*

直接赋值就可以了

const char* cpc;
char* pc="abcde";
cpc=pc;

参考

const char* 和char* 之间的转换


One more thing

更多关于人工智能、Python、C++、计算机等知识,欢迎访问我的个人博客进行交流, 点这里~~

展开阅读全文
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值