char*、string、CString这三种字符串类型各有各的优点,比如CString比较灵活,是基于MFC常用的类型,安全性也最高,但可移植性最差。string是使用STL时必不可少的类型,所以是做工程时必须熟练掌握的;char*是从学习C语言开始就已经和我们形影不离的了,有许多API都是以char*作为参数输入的。
char*类型:是字符指针,在一定条件下等同于字符数组,如果字符数组的最后元素是"\0",则是一个C风格的字符串。
string类型:标准C中是不存在string类型的,string是标准C++扩充字符串操作的一个类。但是我们知道标准C中有这个头文件,这里要区分清楚,此string非彼string。这个头文件中定义了一些我们经常用到的操作字符串的函数,如:strcpy、strcat、strcmp等等,但是这些函数的操作对象都是char*指向的字符串。 而C++的string类操作对象是string类型字符串,该类重载了一些运算符,添加了一些字符串操作成员函数,使得操作字符串更加方便。有的时候我们要将string串和char*串配合使用,所以也会涉及到这两个类型的转化问题。
CString类型:利用MFC进行编程时,我们从对话框中利用GetWindowText得到的字符串是CString类型,CString是属于MFC的类。而一些标准C/C++库函数是不能直接对CString类型进行操作的,所以我们经常遇到将CString类型转化char*等等其他数据类型的情况。
作为类的string和CString,有不同的构造函数来声明字符串,也重载了不同的操作符可供使用,同时有不同的方法可供调用,其中就包括字符串转换的方法:
1 需要包含的头文件
char*类型:<>,其中包含有字符串库函数,如strcat()等,在C++中,<>等同于<cstring>
string类型:<string>,是C++的类库;
CString类型:<a;,是MFC的类库;
2 string → CString
string str = "reading\\bible.chm"; ShellExecute(0,"open",(),"",NULL,SW_SHOW); //system(());3 CString → string
CString cstr= "test"; string str = c(0); c(-1);4 string → char *
主要有三种方法可以将str转换为char*类型,分别是:data(); c_str(); copy();
3.1 data()方法
string str = "hello"; const char* p = (); //加const 或者用char * p=(char*)();的形式3.2 c_str()方法
string str="world"; const char *p = ();c_str()和data()区别是:前者返回带'\0'的字符串,后者则返回不带'\0'的字符串
3.3 copy()方法
string str="hmmm"; char p[50]; (p, 5, 0);//这里5代表复制几个字符,0代表复制的位置, *(p+5)='\0';//注意手动加结束符!!! printf("%s",p);5 char * → string
char *chs = "C++"; string Str = string(chs); //或直接赋值 char *chs = "hello"; string str = chs;6 CString → char *
CString cstr; char* chs; // 三种方法 chs = (char*)c(0); chs = (char*)c()); chs = (char*)(LPCTSTR)cstr;7 char * → CString
char *path2 = "F:\\templates\\000txt\\original.txt"; CString cstr = path2; \\直接赋值 \\c(_T("%s"), path2); \\ 使用CString对象方法Format CString m_status = "文件成功保存!" + cstr + strdatetime;8 CString和int的转换
int i = 123; CString str; ( "%d",i); //int->CString 其他的基本类型转化类似 i = atoi(str); //CString->int 还有(atof,atol)9 总结一下
char *是字符指针,c可以直接做为右值赋值给CString或string类型。在一定条件下,等同于字符数组,是C风格的字符串。
CString和string是类,有类方法或构造方法可供字符转换使用。CString的format方法是非常好用的。string的c_str()也是非常常用的,可以转换为CString或char *,但要注意和char *转换时,要把char定义成为const char*,这样是最安全的。对于CString与其他类型的转化方法很多,但其实都殊途同归,朝着一个方向即将类型首先转化为char*类型,因为char*是不同类型之间的桥梁。 得到char*类型,转化为其他类型就非常容易了。
之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必担心内存是否足够、字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要。我们可以用 = 进行赋值操作,== 进行比较,+ 做串联等等。我们尽可以把它看成是C++的基本数据类型。
以上函数UNICODE编码也没问题:unicode下照用,加个_T()宏就行了,像这样子_T("%s")
string类的字符操作:
char &operator[](int n); char &at(int n);operator[]和at()均返回当前字符串中第n个字符的位置,但at函数提供范围检查,当越界时会抛出out_of_range异常,下标运算符[]不提供检查访问。
对于CString:
CString s = "This is a test"; // 8-bit only CString s = _T("This is a test"); // Unicode-aware CString s("This is a test"); // 8-bit only CString s(_T("This is a test")); // Unicode-aware CString s = p; CString s(p);用这些方法可以轻松将常量字符串或指针转换成 CString。
10 宽字节转换
char *chs = (char *(0); int k = m_(); wchar_t *wc = (wchar_t *)malloc(sizeof(wchar_t)*k); // 将ANSI编码的多字节字符串转换成宽字符字符串 int n = MultiByteToWideChar(CP_ACP, 0, chs, strlen(chs), wc, k); if ( n > 0 ) { wc[n] = 0; char *mb = (char *)malloc(sizeof(char)*k*4); //char mb[1024]; // 将宽字符字符串转换成UTF-8编码的多字节字符串 n = WideCharToMultiByte(CP_UTF8, 0, wc, wcslen(wc), mb, k*4, NULL, NULL); if ( n > 0 ) { mb[n] = 0; fwrite(mb, sizeof(char), strlen(mb), fp); } free(mb); } free(wc);-End-