强制类型转换、使用函数转换与memcpy
如果一个int
型的变量值为5
,则若使用强制类型转换或者使用memcpy,则相当于直接copy内存中的值,若打印,则会打印5对应的ASCII值;而若使用函数转换,则函数会操作内存转为ASCII值的5
,若打印,则直接为5
。
memcpy在一定程度上相当于强制类型转换,但是可以制定拷贝的字节大小,因此可能不会出现丢失数据,如大于256的时候,int强制转char,复制低8位给char,其余舍弃
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| #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类型转换
1 2 3 4 5 6
| //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
,因此不用加。
例如
1 2 3 4 5 6 7 8 9 10 11 12
| 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()
等等。
1 2
| string s = "12"; int a = atoi(s.c_str());
|
3) 采用sstream头文件中定义的字符串流对象来实现转换。
1 2 3
| istringstream is("12"); //构造输入字符串流,流的内容初始化为“12”的字符串 int i; is >> i; //从is流中读入一个int整数存入i中`
|
int转string的方式
1) 采用标准库中的to_string函数。
1 2
| int i = 12; cout << std::to_string(i) << endl;`
|
不需要包含任何头文件,应该是在utility中,但无需包含,直接使用,还定义任何其他内置类型转为string的重载函数,很方便。
2) 采用sstream中定义的字符串流对象来实现。
1 2 3 4
| ostringstream os; //构造一个输出字符串流,流内容为空 int i = 12; os << i; //向输出字符串流中输出int整数i的内容 cout << os.str() << endl; //利用字符串流的str函数获取流中的内容
|
字符串流对象的str函数对于istringstream和ostringstream都适用,都可以获取流中的内容。
string转char
1 2
| string s = "12"; s.c_str()
|
const char*
和char*
之间的转换
const char*
是指向常量的指针,而不是指针本身为常量,可以不被初始化.该指针可以指向常量也可以指向变量,只是从该指针的角度而言,它所指向的是常量,通过该指针不能修改它所指向的数据.
const char*
转为char*
const char*
是不能直接赋值到char*
的,这样编译都不能通过,理由:假如可以的话,那么通过char*
就可以修改const char
指向的内容了,这是不允许的.所以char*
要另外开辟新的空间。
1 2 3 4 5 6 7 8
| #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*
直接赋值就可以了
1 2 3
| const char* cpc; char* pc="abcde"; cpc=pc;
|
参考
const char 和char 之间的转换