1、char* char[]及string的区别及相互转换
char* char[]及string之间的区别
char* p, 表示p是一个指向字符串的指针
char p[], 表示p是一个字符串的数组
string s, 表示s是一个string类的对象
string转换为char*有3种方法:
1.data
string str="good boy";
const char *p=str.data();
2.c_str
string str="good boy";
const char *p=str.c_str();
注:string类型的c_str函数返回常指针,不能作为左值
3. copy
string str="good boy";
char p[20];
str.copy(p,5,0); //这里5,代表复制几个字符,0代表复制的位置
*(p+5)='\0'; //要手动加上结束符
或者:
string str="good boy";
char *p;
int len = str.length();
p=(char *)malloc((len+1)*sizeof(char));
str.copy(p,len,0);
string转换成char[]
string str = "good boy";
char p[20];
for(int i=0;i<str.length();i++)
p[i] = str[i];
p[str.length()] = '\0';
或者
string str="good boy";
char p[20];
str.copy(p,5,0);
*(p+5)='\0';
char*转char[]
不能直接赋值,可以循环char*字符串逐个字符赋值,也可以使用strcpy_s等函数。
可以直接赋值的转换
char转string
char[]转string
char[]转char
char*类型表示的字符串如何分割、以及太长出现错误的解决办法
字符串的分割输入(加符号\)
char* g_buffer3 = "!X motion \r\n \
PTP/re X, g_motionLength \r\n \
wait 20000 \r\n \
PTP/re X,-g_motionLength \r\n \
STOP \r\n \
";
cout<< g_buffer3 << endl;
上述代码中的\r\n表示换行回车,最后的输出结果是:
!X motion
PTP/re X, g_motionLength
wait 20000
PTP/re X,-g_motionLength
STOP
字符串过长导致编译错误的解决办法
字符串超过16380个单字节字符的限制时,会出现C2026错误。
解决:将某行的\改为右引号,并在下一行首加上左引号(参考https://msdn.microsoft.com/en-us/library/dddywwsc.aspx)
如上述代码应改为:
char* g_buffer3 = "!X motion \r\n \
PTP/re X, g_motionLength \r\n \
wait 20000 \r\n "
"PTP/re X,-g_motionLength \r\n \
STOP \r\n \
";
cout<< g_buffer3 << endl;
这样即便是再长的字符串也不会出现问题,过长的字符串多用几次右引号与做引号即可。
初始化数组为0
void *memset(void *s, int ch, size_t n);
函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法
例如:
int a[10];
memset(a, 0, sizeof(a));
或者:
int a[10] = {0};