先说个题外话,字符串的长度 。
string a = "12345"; a.size() a.length() char a[] = "12345"; strlen(a) sizeof(a)/sizeof(char) char* a = "12345" strlen(a)
char*的sizeof是求的指针的长度,永远是4 !!!。
char* or char[] to string
直接赋即可
char* a = "123"; char b[] = "123"; string c = a; string d = b;
string to char*
string可以被看成是以字符为元素的一种容器。字符构成序列(字符串)。有时候在字符序列中进行遍历,标准的string类提供了STL容器接口。
具有一些成员函数比如begin()、end(),迭代器可以根据他们进行定位。
与char*不同的是,string不一定以NULL(' ')结束。string长度可以根据length()或者size()得到【相同效果】,string可以根据下标访问。
注意const !!!
string a = "123"; const char* b = a.c_str(); const char* c = a.data();
硬转char*
string a = "123"; char* b = new char[a.size()+1]; strcpy_s(b, a.size()+1, a.c_str());
(1)strcpy_s的第二个参数
errno_t strcpy_s( char *strDestination, size_t numberOfElements, const char *strSource ); strDestination 位置的位置字符串缓冲区 numberOfElements 目标字符串缓冲区的大小。 strSource null 终止的源字符串缓冲区。
(2)strcpy
这是一个被microsoft遗弃了(出于安全考虑,很多函数内部是不进行参数检测的(包括越界类的)),会报错,两种解决办法。
strcpy(b, a.c_str()); error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> c:program files (x86)microsoft visual studio 11.0vcincludestring.h(110) : 参见“strcpy”的声明
第一种就是弃用,使用MS推荐的strcpy_s。
第二种就是屏蔽掉。三种办法:
1)在所有#include之前加上 #define _CRT_SECURE_NO_DEPRECATE
2)使用声明 #pragma warning(disable:4996)
3)项目->属性->配置属性->C/C++ -> 预处理器 -> 预处理器定义,增加:
_CRT_SECURE_NO_DEPRECATE