string,CString,int,char*之间的相互转换
《C++标准函数库》中说的
有三个函数可以将字符串的内容转换为字符数组和C—string
1.data(),返回没有”\0“的字符串数组
2.c_str(),返回有”\0“的字符串数组
3.copy()
======================================================================================
Cstring 转 char*
eg.1
char* temp_abc;
CString temp_str;
emp_str=str.Left(str.GetLength()-2);
temp_abc=temp_str.GetBuffer(temp_str.GetLength());
char line[5]="X";
strcat(temp_abc,line);
m_idinput.Format("%s",temp_abc);
GetDlgItem(IDC_EDIT11)->SetWindowText("");
GetDlgItem(IDC_EDIT11)->SetWindowText(m_idinput);
temp_str.ReleaseBuffer()
eg.2
传给未分配内存的指针.
CString cstr = "ASDDSD";
char *ch =cstr.GetBuffer(cstr1.GetLength() + 1);
cstr.ReleaseBuffer();
//修改ch指向的值等于修改cstr里面的值.
//PS:用完ch后,不用delete ch,因为这样会破坏cstr内部空间,容易造成程序崩溃.
eg.3
传给未分配内存的const char* (LPCTSTR)指针.
CString cstr(asdd);
const char* ch = (LPCTSTR)cstr;
ch指向的地址和cstr相同。但由于使用const保证ch不会修改,所以安全.
eg.4
把CString 值赋给已分配内存的char *。
CString cstr1 = "ASDDSD";
int strLength = cstr1.GetLength() + 1;
char *pValue = new char[strLength];
strncpy(pValue, cstr1, strLength);
eg.5
把CString 值赋给已分配内存char[]数组.
CString cstr2 = "ASDDSD";
int strLength1 = cstr1.GetLength() + 1;
char chArray[100];
memset(chArray,0, sizeof(bool) * 100);//将数组的垃圾内容清空.
eg.6
Unicode下CString转换为char *
方法一:使用API:WideCharToMultiByte进行转换
CString str = _T("D:\\校内项目");
//注意:以下n和len的值大小不同,n是按字符计算的,len是按字节计算的
int n = str.GetLength(); // n = 14, len = 18
//获取宽字节字符的大小,大小是按字节计算的
int len = WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),NULL,0,NULL,NULL);
//为多字节字符数组申请空间,数组大小为按字节计算的宽字节字节大小
char * pFileName = new char[len+1]; //以字节为单位
//宽字节编码转换成多字节编码
WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),pFileName,len,NULL,NULL);
pFileName[len+1] = '\0'; //多字节字符以'\0'结束
eg.7
使用函数:T2A、W2A
CString str = _T("D:\\校内项目");
//声明标识符
USES_CONVERSION;
//调用函数,T2A和W2A均支持ATL和MFC中的字符转换
char * pFileName = T2A(str);
//char * pFileName = W2A(str); //也可实现转换
注意:有时候可能还需要添加引用#include <afxpriv.h>
eg.8
======================================================================================Cstring 转 string
eg.1
//传统的方法在VS2005的PPC平台上无法编译通过,或者不起作用,要么需要两次转换
//CString->bstr,bstr->string或Cstring->wchar * ->char *等
CString strSomeCstring ("Thisis a CString Object");
// Use ANSI variant CStringA to convert to char*; construct from it -
std::string strStdString (CStringA (strSomeCstring));
eg.2
1.string s = (LPCTSTR)str; 2.char *chr=new char[wo.GetLength()] WideCharToMultiByte(CP_ACP,0,wo.GetBuffer(),-1,chr,wo.GetLength(),NULL,NULL); string str=chr; 3.#include<stdlib.h> #include<tchar.h> _T("dsfds");eg.3
string s(CString.GetBuffer());
GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.
======================================================================================CString转换char[100]
char a[100];
CString str("aaaaaa");
strncpy(a,(LPCTSTR)str,sizeof(a));
CString str="aaa";
char* ch;
ch=(char*)(LPCTSTR)str;
======================================================================================CString 转 int
CString ss="1212.12";
int temp=atoi(ss); //atoi _atoi64或atol
将字符转换为整数,可以使用atoi、_atoi64或atol。
int int_chage = atoi((lpcstr)ss) ;
或:
CString str = "23";
UINT uint;
sscanf(str, "%d", uint);
将字符转换为整数,可以使用atoi、_atoi64或atol。而将数字转换为CString变量,可以使用CString的Format函数。如
CString s;
int i = 64;
s.Format(”%d”, i)
Format函数的功能很强,值得你研究一下
======================================================================================CString 转换为BSTR
调用CString 对象的AllocSysString 方法将CString转化成BSTR,如:
CString str = "this is a test";
BSTR b = str.AllosysString();
str.FreeSystring(); // 最后不要忘记了释放
======================================================================================BSTR 转换为CString
CString convert(BSTR b)
{
CString s;
if(b == NULL)
return s;
#ifdef UNICODE
s = b;
#else
LPSTR p = s.GetBuffer(SYsStringLen(b) + 1);
::WidecharToMultiByte(CP_ACP,
0,
b,
-1,
p,
SysStringLen(b)+1,
NULL,
NULL);
s.ReleaseBuffer();
#endif
return s;
}
======================================================================================char *转换为Cstring
☆直接赋值
☆利用格式化转换
CString strConvert;
TCHAR* P = _T("this is a chTostringtest ");
strConvert = p; // 直接赋值
strConvert.Format("%s",p); // 格式化
Unicode下char *转换为CString
方法一:使用API:MultiByteToWideChar进行转换
char * pFileName = "D:\\校内项目";
//计算char *数组大小,以字节为单位,一个汉字占两个字节
int charLen = strlen(pFileName);
//计算多字节字符的大小,按字符计算。
int len = MultiByteToWideChar(CP_ACP,0,pFileName,charLen,NULL,0);
//为宽字节字符数组申请空间,数组大小为按字节计算的多字节字符大小
TCHAR *buf = new TCHAR[len + 1];
//多字节编码转换成宽字节编码
MultiByteToWideChar(CP_ACP,0,pFileName,charLen,buf,len);
buf[len] = '\0'; //添加字符串结尾,注意不是len+1
//将TCHAR数组转换为CString
CString pWideChar;
pWideChar.Append(buf);
//删除缓冲区
delete []buf;
方法二:使用函数:A2T、A2W
char * pFileName = "D:\\校内项目";
USES_CONVERSION;
CString s = A2T(pFileName);
//CString s = A2W(pFileName);
方法三:使用_T宏,将字符串转换为宽字符
//多字节字符集,在vc6和vc7种可以编译通过的语句,但VS2005不能通过,默认为Unicode字符集
//AfxMessageBox("加载数据失败",0);
//书写代码使用TEXT("")或_T(""),文本在UNICODE和非UNICODE程序里都通用
AfxMessageBox(_T("加载数据失败"),0);
注意:直接转换在基于MBCS的工程可以,但在基于Unicode字符集的工程中直接转换是不可行的,CString会以Unicode的形式来保存数据,强制类型转换只会返回第一个字符。
使用以前转换CString的方法或者网上别人的指导用法,都失效了
1.strcpy_s( pchar, sizeof(pchar), mCString.GetBuffer(mCString.GetLength()) );不行,mCString.GetBuffer()返回的是wchar_t数组,使用Unicode字符集时,wchar_t无法自动转换为char*.
2.strcpy_s(pchar, sizeof(pchar),(LPCSTR)_bstr_t(mCString));不行,"_bstr_t找不到识别符"
3.char *pch = (LPSTR)(LPCTSTR)mCString; 这样没有报错,但pch只能获得CString的第一个字符而已,第一个换成(char*),也只能获取第一个字符。郁闷。
4.CString.GetBuffer(CString.GetLength())不行。w_char*不能转为_char*。
======================================================================================char* 转 int
#include <stdlib.h>
int atoi(const char *nptr);
long atol(const char *nptr);
long long atoll(const char *nptr);
long long atoq(const char *nptr);
======================================================================================char* 转 string
string s(char *);
你的只能初始化,在不是初始化的地方最好还是用assign().
======================================================================================constchar * 转const char
cannot convert from 'const char *' to'char *'
const char *c=aa.c_str();
string.c_str()只能转换成const char
====================================================================================== c har 转 CstringCString.format(”%s”, char*);
======================================================================================char 转 string
string s(char *);
只能初始化,在不是初始化的地方最好还是用assign().
======================================================================================string 转 CString
CString.format("%s",string.c_str());
用c_str()确实比data()要好.
======================================================================================
string 转 int
atoi(s.c_str());
1) 在C标准库里面,使用atoi:
#include <cstdlib>
#include <string>
std::string text = "152";
int number = std::atoi( text.c_str() );
if (errno == ERANGE) //可能是std::errno
{
//number可能由于过大或过小而不能完全存储
}
else if (errno == ????)
//可能是EINVAL
{
//不能转换成一个数字
}
2) 在C++标准库里面,使用stringstream:(stringstream 可以用于各种数据类型之间的转换)
#include <sstream>
#include <string>
std::string text = "152";
int number;
std::stringstream ss;
ss << text;//可以是其他数据类型
ss >> number; //string -> int
if (! ss.good())
{
//错误发生
}
ss << number;// int->string
string str = ss.str();
if (! ss.good())
{
//错误发生
}
3) 在Boost库里面,使用lexical_cast:
#include <boost/lexical_cast.hpp>
#include <string>
try
{
std::string text = "152";
int number = boost::lexical_cast< int >(text );
}
catch( const boost::bad_lexical_cast& )
{
//转换失败
}
======================================================================================
string 转 char *
char *p = string.c_str();
string aa("aaa");
char *c=aa.c_str();
string mngName;
char t[200];
memset(t,0,200);
strcpy(t,mngName.c_str());
======================================================================================string类型转换成long型
首先,atoi并不是vc的库,是标准c的一个库函数
在c++中如果不采用这个函数的话,可以使用stringstream来转换,如下:
#include <sstream>
std::string str("123");
long num;
std::stringstream sstr;
sstr<<str;
sstr>>num;
sstr.clear();//下次转换之前必须调用这个
如果你使用boost库的话,会更简单一点:
#include <boost/lexical_cast.hpp>
string str("123");
longnum=boost::lexical_cast<long>(str);
当然boost内部实现也是采用stringstream的方式转换的
======================================================================================int 转 CString:
CString.Format("%d",int);
======================================================================================
int 转 string
一、使用atoi
itoa( int value, char *string, int radix );
第一个参数:你要转化的int;
第二个参数:转化后的char*;
第三个参数:你要转化的进制;
eg.
int n = 30;
char c[10];
itoa(n, c, 2);
cout << "2-> "<< c << endl;
二、使用sprintf
头文件 #include<stdio.h>
语法: int sprintf(string format, mixed [args]...);
返回值:字符串长度(strlen)
转换字符
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
% 印出百分比符号,不转换。
b 整数转成二进位。
c 整数转成对应的 ASCII 字元。
d 整数转成十进位。
f 倍精确度数字转成浮点数。
o 整数转成八进位。
s 整数转成字串。
x 整数转成小写十六进位。
X 整数转成大写十六进位。
Eg.
int n = 30;
char c[20];
sprintf(c, "%d", n);
cout << c << endl
三、使用stringstream
举例:
//-------------------------------------
//功能:C++ int 转 string (使用stringstream)
//环境:VS2005
//-------------------------------------
#include "stdafx.h"
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main()
{
stringstream strStream;
int a = 100;
float f = 23.5566;
strStream << a << "----"<< f ;
string s = strStream.str();
cout << s << endl;
system("pause");
return 0;
}
四.
#include <string>//使用C++标准库的string类时
using namespace std;//同上
#include <sstream>
#include <iostream>
#include <stdlib.h>//要将string类和int类型直接转换最好有这些包含,
//因为自己写一个转换函数比较方便,函数定义参考如下:
string getstring(const int n)
{
std::stringstream newstr;
newstr<<n;
return newstr.str();
}
======================================================================================int 转 char *
在stdlib.h中有个函数itoa()
itoa的用法:
itoa(i,num,10);
i 需要转换成字符的数字
num 转换后保存字符的变量
10 转换数字的基数(进制)10就是说按照10进制转换数字。还可以是2,8,16等等你喜欢的进制类型
原形:char *itoa(int value, char* string, int radix);
实例:
#include "stdlib.h"
#include "stdio.h"
main()
{
int i=1234;
char s[5];
itoa(i,s,10);
printf("%s",s);
getchar();
}
======================================================================================一、其它数据类型转换为字符串
短整型(int)
itoa(i,temp,10);///将i转换为字符串放入temp中,最后一个数字表示十进制
itoa(i,temp,2); ///按二进制方式转换
长整型(long)
ltoa(l,temp,10);
二、从其它包含字符串的变量中获取指向该字符串的指针
CString变量
str = "2008北京奥运";
buf = (LPSTR)(LPCTSTR)str;
BSTR类型的_variant_t变量
v1 = (_bstr_t)"程序员";
buf =_com_util::ConvertBSTRToString((_bstr_t)v1);
三、字符串转换为其它数据类型
strcpy(temp,"123");
短整型(int)
i = atoi(temp);
长整型(long)
l = atol(temp);
浮点(double)
d = atof(temp);
四、其它数据类型转换到CString
使用CString的成员函数Format来转换,例如:
整数(int)
str.Format("%d",i);
浮点数(float)
str.Format("%f",i);
字符串指针(char *)等已经被CString构造函数支持的数据类型可以直接赋值
str = username;
五、BSTR、_bstr_t与CComBSTR
CComBSTR、_bstr_t是对BSTR的封装,BSTR是指向字符串的32位指针。
char *转换到BSTR可以这样: BSTR b=_com_util::ConvertStringToBSTR("数据");///使用前需要加上头文件comutil.h
反之可以使用char *p=_com_util::ConvertBSTRToString(b);
======================================================================================
Cstring ting ="1234";
int num = atoi(ting);
num的值为1234.
CString ting = "1234 ";
double num = atof(ting);
最终结果:num值为 1234.0000000000000
2.int 转换为字符串
示例代码:
int iii = 123456789;
char ii[100];
itoa(iii, ii, 10);
ii 中的结果就是字符串"123456789"
int iii = 12;
char ii[100];
itoa(iii, ii, 2);
ii 中的结果是字符串"1100"。
3.long 转换为字符串
ling l = 100; char temp[10];
memset(temp,0,10);
ltoa(l,temp,10);
4.double 转换为字符串
int decimal, sign;
char *buffer;
dobule source = 3.1415926535;
buffer = _fcbt( source, 7, &decimal,&sign );
输出结果:sourec:3.1415926535;buffer:'31415927' decimal: 1 sign:0
5.日期类型转换为字符串
CTime ti = Ctime::GetCurrentTime();
Cstring strTemp("");
strTemp = ti.Format("%Y%m%d%H%H%S")
6. 字符串转换为短整型
int atoi( const char *string );
其中,参数 const char *string为要转换的字符串,返回值为转换的结果。
7.字符串转换为长整型
long atol(const char * string)
8.字符串转换为双精度类型
double atof(const char* string)
11. BSTR、_bstr_t 与 CComBSTR的关系
CComBSTR是ATL对BSTR的封装,_bstr_t是C++对BSTR的封装,
BSTR是32位指针,但并不是直接指向字符串的缓冲区。
(1). char *转换到BSTR
BSTR b =_com_util::ConvertStringToBSTR("数据");
SysFreeString(bstrValue);
(2).BSTR转换到char*
char*p=_com_util::ConvertBSTRToString(b);
delete p;
12.typedef和typename关键字
这两个关键字在运用的时候时常会令人迷惑,其实很简单,typedef是类型定义,
而typename是类型解释。
(1).typedef关键字
类型说明给已经存在的数据类型起一个别名,定义名字表示这个类型的新名字。
类型说明的格式为typedef 类型 定义名;
例如,用下面语句定义整型数的新名字:
typedef int INT_COUNT; // 可读性更强(计数器类型为整型)
INT_COUNT intcount;
intCount = 123;
cout << intCount << endl;
typedef同样可用来说明结构、联合以及枚举和类。 如:
typedef struct book{
float fprice;
char* szAuthor[20];
int nPage;}
*BOOK;
viod fun()
{
BOOK mybook = new book;
myBook -> fPrice = 40.80;
myBook -> szAuthor = "jf";
myBook -> npage = 200;
}
(2).typename 关键字
typename和class用在模版定义开始部分时,它们的意义相同,但tpyename是用来
告诉编译器模版中有一个表示类型名。
Template<clsaa T>calss fun{
Void bar(){
T::Bletch * p;
.... ....
}
}
在上述代码中,T::Bletch * p是指什么,这一点就很让人迷惑。但如果写成这样就不会
出现这个问题:
Template<class T> class fun
{
Void bar()
{
Typename T::Bletch * p;
}
}
在模版定义里,也可以用<typename T>代替<class T>,即 template<class T>与
templare<typename T>具有相同意义。
13.VARIANT的处理技巧
1.VARIANT的定义
VARIANT被称为变体类型,其定义可以参考头文件VC98\INCLUDE\OAIDL.H
关于结构体 tagVARIANT定义。
2.引入VARIANT的原因
目前计算机语言多种多样,如C++、java、Basic、Pascal等,它们各自又都有自己的
数据类型,VARIANT数据类型就具有跨语言的特性,同时它可以表示(储存)任意类型
的数据。从C语言的角度来讲,VARIANT其实是一个结构,结构中用一个域(vt)表示,同时
正真的数据则存储在union空间中。
3.VARIANT的应用
利用VARIANT表示可一个整型数据:
VARIANT va;
int a=2001;
va.vt = VT_I4; // 指明整型数据
va.lVal=a; // 赋值
利用VARIANT表示一个布尔值:
VARIANT va;
vb.vt = VT_BOOL; // 指明整型数据
va.boolVal = VARIANT_TRUE; // 赋值
利用VARIANT保存一个字符串:
VARIANT va;
va.vt = VT_BSTR;
va.bstrVal =SysAllocString(L"Hello,this is a test ");
从上面可以看出这种类型使用起来比较复杂,其实有简单的方法,采用VARIANT的封装类_variant_t,
其赋值
可以使用强制类型转换,其构造函数会自动处理这些数据类型。
代码参考如下:
long l=222;
ing i=100;
_varint_t lVal(l);
lVal = (long)i;
也可以用ColeVariant来简化对VARIANT的操作,代码参考如下:
COleVariant v3 = "this is atest", v4 = (long)1999;
CString str = (BSTR)v3.pbstrVal;
long i = v4.lVal;