C++

字符串-使用总结2

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};