C++中CString string char* char 之间的字符转换(多种方法)

 更新时间:2020年4月25日 17:29  点击:1605

首先解释下三者的含义

CString 是一种很有用的数据类型。它们很大程度上简化了MFC中的许多操作(适用于MFC框架),使得MFC在做字符串操作的时候方便了很多。需要包含头文件#include <afx.h>

C++是字符串,功能比较强大。要想使用标准C++中string类,必须要包含#include <string>// 注意是<string>,不是<string.h>,带.h的是C语言中的头文件。Char * 专门用于指以'\0'为结束的字符串.

以下方法来进行转换:

// CharConvert.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#include<afx.h>
#include<string>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
	//此方法适用于“多字节” 否则会出现'strcpy' : cannot convert parameter 2 from 'unsigned short *' to 'const char *'
	/*CString str("Hello zzu");
	cout<<"the CString is "<<str<<endl;
	char a[100];
	strcpy(a,str);
	cout<<"the convert to char * is "<<a<<"(char *)"<<endl;*/

	//CString 转换成string
	//  CString c_str1("Hello Zhengzhou University");
	//string str;
	//str=c_str1.GetBuffer(0);
	//c_str1.ReleaseBuffer();  //否则就没有释放缓冲区所占的空间
	//cout<<str<<endl;
	//cout<<"\n"<<c_str1<<endl;

	//string 转换成CString
	/*string str1("Hello College of Information Engineering");
	CString c_str2;
	c_str2=str1.c_str(); //c_str():生成一个const char*指针,指向以空字符终止的数组。
	cout<<"the CString is "<<c_str2<<endl;
	cout<<"the string is "<<str1<<endl;*/

	//string转换成const char*
	//方法一:
	//string str2("Hello College of Information Engineering");
	//const char * str3;  //常数指针
	//str3=str2.c_str();
	//cout<<"string  is  "<<str2<<endl;
	//cout<<"const char is "<<str3<<endl;
	

	//方法二:
 // /* string str("Hello College of Information Engineering");
	//const char * c_str;
	//c_str=str.data();
	//cout<<"string is  "<<str<<endl;
	//cout<<"const char is"<<c_str<<endl;*/
	
	
	
	//string 直接转换成char*
	///*string s1 = "abcdefg";
	//char *data;
	//int len = s1.length();
	//data = (char *)malloc((len)*sizeof(char));
	//s1.copy(data,len,0);
	//cout<<len<<endl;
	//cout<<data<<endl;*/
	
  
    
	//string.copy()的用法
	  //size_t length;
  //  char buffer[8];
  // string str("Test string......");
  //  
  // length=str.copy(buffer,7,6);    //从buffer6,往后数7个,相当于[ buffer[6], buffer[6+7] )
  // buffer[length]='\0';            //加上'\0'使得buffer就到buffer[length]为止;
 
  // cout <<"buffer contains: " << buffer <<endl;
  //char * 转换成string


	//char *到string
  /* char * c_str="zzu";
	string str(c_str);
	cout<<"the c_str "<<c_str<<endl;
	cout<<"the string is"<<str<<"and length is "<<str.length()<<endl;*/


	//char a[]="asd";
	//cout<<strlen(a)<<endl; //为什么显示的是3,不是有一个\0吗

	//char * 到CString
  
	////char * c_str1="zzu";
	////CString str; //可以直接转换,因为CString存在重载(在多字节字符集下适用)
	////str.Format("%s",c_str1);
	////cout<<"the c_str1 is"<<c_str1<<endl;	
	////cout<<"the CString is"<<str<<endl;



	//方法1:使用API:WideCharToMultiByte进行转换(使用过,有效)
   //CString str= CString("This is an example!");
   //int n = str.GetLength(); //按字符计算,str的长度
   //int len = WideCharToMultiByte(CP_ACP,0,str,n,NULL,0,NULL,NULL);//按Byte计算str长度
   //char *pChStr = new char[len+1];//按字节为单位
   //WideCharToMultiByte(CP_ACP,0,str,n,pChStr,len,NULL,NULL);//宽字节转换为多字节编码
   // pChStr[len] = '\0';//不要忽略末尾结束标志
   //用完了记得delete []pChStr,防止内存泄露
	return 0;
}

同时需要注意的是,我们在平成写程序时,最好搞清我们的编译环境中的编码方式,不同的编码方式可以会导致一些字符转换失败,当我们编程开始,就要想好在哪个编码方式下进行,以免最后出现换编码方式了,代码却出现很多错误(很让人头疼),比如sqlite数据库中的中文字符乱码问题就是由于编码方式和数据库中默认的编码方式不一致。这点在我们写程序时一定谨记。

MFC中char*,string和CString之间的转换补充

一、    将CString类转换成char*(LPSTR)类型

方法一,使用强制转换。例如:

CString theString( "This  is a test" );
LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString;

方法二,使用strcpy。例如:

CString theString( "This  is a test" );
LPTSTR lpsz = new TCHAR[theString.GetLength()+1];
_tcscpy(lpsz, theString);

方法三,使用CString::GetBuffer。例如:

CString s(_T("This is a  test "));
LPTSTR p = s.GetBuffer();
// 在这里添加使用p的代码
if(p != NULL) *p =  _T('\0');
s.ReleaseBuffer();
// 使用完后及时释放,以便能使用其它的CString成员函数

CString str = "ABCDEF";
char *pBuf = str,GetBuffer( 0 );
str.ReleaseBuffer();

二、     string转char*

string 是c++标准库里面其中一个,封装了对字符串的操作
把string转换为char* 有3种方法:
1。data(),返回没有”\0“的字符串数组
如:
string str="abc";
char  *p=str.data();
2.c_str 返回有”\0“的字符串数组
如:string  str="gdfd";
    char *p=str.c_str();
3 copy
比如
string  str="hello";
char p[40];
str.copy(p,5,0); //这里5,代表复制几个字符,0代表复制的位置
*(p+5)='\0';  //要手动加上结束符
cout < < p;

三、     字符串string转换为其它数据类型

temp="123456";
1)短整型(int)
i =  atoi(temp);
2)长整型(long)
l =  atol(temp);
3)浮点(double)
d =  atof(temp);
string s; d= atof(s.c_str());
4)BSTR变量
BSTR bstrValue =  ::SysAllocString(L"程序员");
...///完成对bstrValue的使用
SysFreeString(bstrValue);
5)CComBSTR变量
CComBSTR类型变量可以直接赋值
CComBSTR  bstrVar1("test");
CComBSTR bstrVar2(temp);
6)_bstr_t变量
_bstr_t类型的变量可以直接赋值
_bstr_t  bstrVar1("test");
_bstr_t bstrVar2(temp);

四、     Char*转换为string

如果要把一个char 转换成string, 可以使用 string s(char  *);

五、string 转CString 

CString.format("%s",  string.c_str());

六、char 转CString 

CString.format("%s", char*);

七、     CString -> string

string  s(CString.GetBuffer()); 
GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.

八、CString互转int

将字符转换为整数,可以使用atoi、_atoi64或atol。 
而将数字转换为CString变量,可以使用CString的Format函数。如 

CString s; 
int i = 64; 
s.Format("%d", i)

[!--infotagslink--]

相关文章

  • C语言中的字符(char)详细讲解

    本篇文章主要介绍C语言中char的知识,并附有代码实例,以便大家在学习的时候更好的理解,有需要的可以看一下...2020-04-25
  • 详解C++ string常用截取字符串方法

    这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • mybatis 返回Integer,Double,String等类型的数据操作

    这篇文章主要介绍了mybatis 返回Integer,Double,String等类型的数据操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-25
  • 深入研究mysql中的varchar和limit(容易被忽略的知识)

    为什么标题要起这个名字呢?commen sence指的是那些大家都应该知道的事情,但往往大家又会会略这些东西,或者对这些东西一知半解,今天我总结下自己在mysql中遇到的一些commen sense类型的问题。 ...2015-03-15
  • 浅谈C++中的string 类型占几个字节

    本篇文章小编并不是为大家讲解string类型的用法,而是讲解我个人比较好奇的问题,就是string 类型占几个字节...2020-04-25
  • 【C#基础】Substring截取字符串的方法小结(推荐)

    这篇文章主要介绍了Substring截取字符串方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • java中String类型变量的赋值问题介绍

    下面小编就为大家带来一篇java中String类型变量的赋值问题介绍。小编觉得挺不错的。现在分享给大家,给大家一个参考。...2016-03-28
  • C# 中string.split用法详解

    本文给大家分享了C# 中string.split用法的相关知识,非常不错,具有参考借鉴价值,需要的朋友参考下吧...2020-06-25
  • c#中的常用ToString()方法总结

    很多类都重写了ToString方法, 导致很多类的tostring到底执行了什么,有哪些参数,都不清楚...2020-06-25
  • Go中string与[]byte高效互转的方法实例

    string与[]byte经常需要互相转化,普通转化会发生底层数据的复制,下面这篇文章主要给大家介绍了关于Go中string与[]byte高效互转的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下...2021-09-20
  • 在C#的类或结构中重写ToString方法的用法简介

    这篇文章主要介绍了在C#的类或结构中重写ToString方法的用法简介,需要的朋友可以参考下...2020-06-25
  • Javascript实现Array和String互转换的方法

    这篇文章主要介绍了Javascript实现Array和String互转换的方法,涉及JavaScript中toString方法与split方法的使用技巧,需要的朋友可以参考下...2015-12-24
  • C#中enum和string的相互转换

    这篇文章主要介绍了C#中enum和string的相互转换的相关资料,需要的朋友可以参考下...2020-06-25
  • C#中Byte[]和String之间转换的方法

    很多朋友不清楚如何在Byte[]和String之间进行转换?下面小编给大家带来了byte与string转换的方法,感兴趣的朋友参考下吧...2020-06-25
  • C++ 字符串string和整数int的互相转化操作

    这篇文章主要介绍了C++ 字符串string和整数int的互相转化操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-10
  • C# 字符串string和内存流MemoryStream及比特数组byte[]之间相互转换

    本文主要介绍字符串string和内存流MemoryStream及比特数组byte[]之间相互转换的方法,需要的小伙伴可以参考一下。...2020-06-25
  • C++ string替换指定字符实例代码

    这篇文章主要给大家介绍了关于C++ string替换指定字符的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-04-25
  • Mysql中关于Incorrect string value的解决方案

    在对mysql数据库中插入数据的时候,直接插入中文是没有问题的!但是用预编译语句时,用流对数据进行处理总报incorrect string value这个异常。本篇文章教给你解决方法...2021-09-20
  • C#语言中字符类char的使用方法(总结)

    下面小编就为大家带来一篇C#语言中字符类char的使用方法(总结)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • String.Format大全(C# Java)

    String.format无论是在C#中还是在java中应用都非常广泛,今天小编抽个时间把有关string.format知识总结分享给大家,需要的朋友可以参考下...2020-06-25