( 转)MFC/C++/C中字符类型CString, int, string, char*之间的转换

    1 CString,int,string,char*之间的转换 
    string 转 CString 
    CString.format("%s", string.c_str()); 
     
    char 转 CString 
    CString.format("%s", char*); 
     
    charstring 
    string s(char *); 
     
    stringchar * 
    char *p = string.c_str(); 
     
     //  CString转std::string
     CString str = dlg.GetPathName();
     setlocale(LC_ALL, "chs");
     char *p = new char[256];
     wcstombs( p, str, 256 );
     m_fileName = p;
     
    1string -> CString 
    CString.format("%s", string.c_str()); 
    用c_str()确实比data()要好. 
    2char -> string 
    string s(char *); 
    你的只能初始化,在不是初始化的地方最好还是用assign(). 
    3,CString -> string 
    string s(CString.GetBuffer()); 
    GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间. 
     
     
    《C++标准函数库》中说的 
    有三个函数可以将字符串的内容转换为字符数组和C—string 
    1.data(),返回没有”\0“的字符串数组 
    2,c_str(),返回有”\0“的字符串数组 
    3,copy() 
     
     
    CString互转int 
     
    将字符转换为整数,可以使用atoi、_atoi64或atol。 
    而将数字转换为CString变量,可以使用CString的Format函数。如 
    CString s; 
    int i = 64; 
    s.Format("%d", i) 
    Format函数的功能很强,值得你研究一下。 
     
    void CStrDlg::OnButton1() 
    { 
    // TODO: Add your control notification handler code here 
    CString 
    ss="1212.12"; 
    int temp=atoi(ss); 
    CString aa; 
    aa.Format("%d",temp); 
    AfxMessageBox("var is " + aa); 
    } 
     
    sart.Format("%s",buf); 
     
    CString互转char* 
     
    ///char * TO cstring 
    CString strtest; 
    char * charpoint; 
    charpoint="give string a value"; 
    strtest=charpoint; 
     
     
    ///cstring TO char * 
    charpoint=strtest.GetBuffer(strtest.GetLength()); 
     
    标准C里没有string,char *==char []==string 
     
    可以用CString.Format("%s",char *)这个方法来将char *转成CString。要把CString转成char *,用操作符(LPCSTR)CString就可以了。 
     
     
    CString转换 char[100] 
     
    char a[100]; 
    CString str("aaaaaa"); 
    strncpy(a,(LPCTSTR)str,sizeof(a)); 
    2 CString类型的转换成int 
    CString类型的转换成int 
    将字符转换为整数,可以使用atoi、_atoi64或atol。 
     
    //CString aaa = "16" ;
    //int int_chage = atoi((lpcstr)aaa) ; 
     
     
    而将数字转换为CString变量,可以使用CString的Format函数。如 
    CString s; 
    int i = 64; 
    s.Format("%d", i) 
    Format函数的功能很强,值得你研究一下。 
    如果是使用char数组,也可以使用sprintf函数。
     
    //CString ss="1212.12"; 
    //int temp=atoi(ss); 
    //CString aa; 
    //aa.Format("%d",temp); 
     
     
    数字->字符串除了用CString::Format,还有FormatV、sprintf和不需要借助于Afx的itoa 
     
    3 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); 
     
    4 CString,int,string,char*之间的转换 
    string aa("aaa");
    char *c=aa.c_str();
     
     
    cannot convert from 'const char *' to 'char *'
    const char *c=aa.c_str(); 
     
    5 CString,int,string,char*之间的转换 
    string.c_str()只能转换成const char *,
    要转成char *这样写:
     
    string mngName;
    char t[200]; memset(t,0,200); strcpy(t,mngName.c_str());


你是在拿CString的值向string或者char*
CString向这些类型转化的时候,要使用CT2A()这个宏
比如
CString cs;
string s;
s = cs;//这样是错误的
s = CT2A(cs);//要这样用

如何实现CString 与folat    int    char *     CTime    string等的互相转变方法。

PS :string是标准模板库里的,名字空间是std,string是一个数据类型,CString是一个类,

      CString 是一种很特殊的 C++ 对象,它里面包含了三个值:一个指向某个数据缓冲区的指针、一个是该缓冲中有效的字符记数(它是不可存取的,是位于 CString 地址之下的一个隐藏区域)以及一个缓冲区长度。 有效字符数的大小可以是从0到该缓冲最大长度值减1之间的任何数(因为字符串结尾有一个NULL字符)。字符记数和缓冲区长度被巧妙隐藏。

1. CString 与 float 的转变

1) CString 转变为float

    CString strContent;

    float fNum;

   fNum=atof(strContent);

2)float 转变为CString

     CString   strContent;        float   fNum;       strContent.format("%f",fNum);

2. CString 与int 的转变

1)CString转变为int

   CString strContent;

    int nNum;

   nNum=atoi(strContent);

2) int 转变为CSting

    CString   strContent;        int nNum;       strContent.format("%d",nNum);

3. CString与char *的转变

   1)CString转变为 char *   方法一,使用强制转换。例如:

        CString strString;        LPTSTR lpsz =(LPTSTR)(LPCTSTR)strString;

  方法二,使用strcpy。例如:

        CString strString;        LPTSTR lpsz = new TCHAR[strString.GetLength()+1];         _tcscpy(lpsz, strString);

  需要说明的是,strcpy(或可移值的_tcscpy)的第二个参数是 const wchar_t* (Unicode)或const char* (ANSI),系统编译器将会自动对其进行转换。

  方法三,使用CString::GetBuffer。    CString   strContent;       char*   pcContent;           pcContent=strContent.GetBuffer(strContent.GetLength());       strContent.ReleaseBuffer();    如果你需要修改 CString 中的内容,它有一个特殊的方法可以使用,那就是 GetBuffer,它的作用是返回一个可写的缓冲指针。     在 GetBuffer 和 ReleaseBuffer 之间这个范围,一定不能使用你要操作的这个缓冲的 CString 对象的任何方法。

因为 ReleaseBuffer 被调用之前,该 CString 对象的完整性得不到保障。       2) char *转变为 CString   将char*转换成CString,除了直接赋值外,还可使用CString::Format进行。    char *pcArray;    CString strContent;    strContent.Format(_T("%s"), pcArray);       

4. CString CTime

1) CTime转变为CStirng:     

    CTime   t;     t.GetCurrentTime();    

CString   s=t.Format("%Y-%B-%d");      

2)CString转变为 CTime:        

CString   s("2007-9-14   19:06:23");

   int   nYear,   nMonth,   nDate,   nHour,   nMin,   nSec;    

sscanf(s,   "%d-%d-%d   %d:%d:%d",   &nYear,   &nMonth,   &nDate,   &nHour,   &nMin,   &nSec);   

  CTime   t(nYear,   nMonth,   nDate,   nHour,   nMin,   nSec);

5. CString string

 1) CString 转变为string CString   strContent;   

  string   str1(strContent.GetString()   );   

  str1=strContent.GetString();   

2)string转变为CString   string   str1;  

   CString  strContent(str1.c_str()   ); 

    strContent =   str1.c_str(); 

  因为 ReleaseBuffer 被调用之前,该 CString 对象的完整性得不到保障。    

2) char *转变为 CString   将char*转换成CString,除了直接赋值外,还可使用CString::Format进行。   

   char *pcArray;    CString strContent;    strContent.Format(_T("%s"), pcArray);       

4. CString CTime

1) CTime转变为CStirng:       

    CTime   t;     t.GetCurrentTime();   

    CString   s=t.Format("%Y-%B-%d");     

 2)CString转变为 CTime:     

    CString   s("2007-9-14   19:06:23");    

  int   nYear,   nMonth,   nDate,   nHour,   nMin,   nSec;    

  sscanf(s,   "%d-%d-%d   %d:%d:%d",   &nYear,   &nMonth,   &nDate,   &nHour,   &nMin,   &nSec);   

  CTime   t(nYear,   nMonth,   nDate,   nHour,   nMin,   nSec);

5. CString string

 1) CString 转变为string CString   strContent;    

      string   str1(strContent.GetString()   );   

       str1=strContent.GetString(); 

2)string转变为CString   string   str1;    

      CString  strContent(str1.c_str()   );    

      strContent =   str1.c_str();  

 

×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××8

在MFC程序中,使用CString来处理字符串是一个很不错的选择。CString既可以处理Unicode标准的字符串,也可以处理ANSI标准的字符串。

CString的Format方法给我们进行字符串的转换带来了很大的方便,比如常见的int、float和double这些数字类型转换为CString字符串只需一行代码就可以实现。

      先看看Format用于转换的格式字符:

       %c                 单个字符
       %d                 十进制整数(int)
       %ld                十进制整数(long)
       %f                 十进制浮点数(float)
       %lf                十进制浮点数(double)
       %o                 八进制数
       %s                 字符串
       %u                 无符号十进制数
       %x                 十六进制数

1、int转换为CString:

CString str;
int number=15;
//str="15"
str.Format(_T("%d"),number);
//str=" 15"(前面有两个空格;4表示将占用4位,如果数字超过4位将输出所有数字,不会截断)
str.Format(_T("%4d"),number);
//str="0015"(.4表示将占用4位,如果数字超过4位将输出所有数字,不会截断)
str.Format(_T("%.4d"),number);

long转换为CString的方法与上面相似,只需要把%d改为%ld就可以了。

2、double转换为CString:

CString str;
double num=1.46;
//str="1.46"
str.Format(_T("%lf"),num);
//str="1.5"(.1表示小数点后留1位,小数点后超过1位则四舍五入)
str.Format(_T("%.1lf"),num);
//str="1.4600"
str.Format(_T("%.4f"),num);
//str=" 1.4600"(前面有1个空格)
str.Format(_T("%7.4f"),num);

float转换为CString的方法也同上面相似,将lf%改为f%就可以了。

3、将十进制数转换为八进制:

CString str;
int num=255;
//str="377"
str.Format(_T("%o"),num);
//str="00000377"
str.Format(_T("%.8o"),num);

 

××××××××××××××××××××××××××××××××××××

CString,string,char*的综合比较

 

(一) 概述 

string和CString均是字符串模板类,string为标准模板类(STL)定义的字符串类,已经纳入C++标准之中; 

CString(typedef CStringT > CString)为Visual C++中最常用的字符串类,继承自CSimpleStringT类,主要应用在MFC和ATL编程中,主要数据类型有char(应用于ANSI),wchar_t(unicode),TCHAR(ANSI与unicode均可); 

char*为C编程中最常用的字符串指针,一般以'\0'为结束标志; 

(二) 构造 

string是方便的,可以从几乎所有的字符串构造而来,包括CString和char*; 

CString次之,可以从基本的一些字符串变量构造而来,包括char*等; 

char*没有构造函数,仅可以赋值; 

举例: 

char* psz = “joise”; 

CString cstr( psz ); 

string str( cstr ); 

(三) 运算符重载 

a) operator= 

string是最方便的,几乎可以直接用所有的字符串赋值,包括CString和char*; 

CString次之,可以直接用些基本的字符串赋值,包括char*等; 

char*只能由指针赋值,并且是极危险的操作,建议使用strcpy或者memcpy,而且char*在声明的时候如未赋初值建议先设为NULL,以避免野指针,令你抓狂; 

举例: 

char *psz = NULL; 

psz = new char[10]; //当然,以上的直接写成char *psz = new char[10];也是一样 

memset( psz, 0, 10 ); 

strcpy( psz, “joise” ); 

CString cstr; 

cstr = psz; 

string str; 

str = psz; 

str = cstr; 

delete []psz; 

b) operator+ 

string与CString差不多,可以直接与char*进行加法,但不可以相互使用+运算符,即string str = str + cstr是非法的,须转换成char*; 

char*没有+运算,只能使用strcat把两个指针连在一起; 

举例: 

char* psz = “joise”; 

CString cstr = psz; 

cstr = cstr + psz; 

string str = psz; 

str = str + str + psz; 

strcat( psz, psz ); 

strcat( psz, cstr );//合法 

strcat( psz, str );//非法,由此可见,CString可自动转换为const char*,而string不行 

c) operator += 

string是最强大的,几乎可以与所有的字符串变量+=,包括CString和char*; 

CString次之,可以与基本的一些字符串变量进行+=而来,包括char*等; 

char*没有+=运算符,只能使用strcat把两个指针连在一起; 

d) operator[] 

CString最好,当越界时会抛出断言异常; 

string与char*下标越界结果未定义; 

举例: 

char* psz = “joise”; 

CString cstr = psz; 

cout << cstr[8]; 

string str = psz; 

cout << str[8]; 

cout << psz[8]; 

e) operator== 、operator!=、operator> 、operator< 、operator>= 、perator<= 

CString与string之间不可以进行比较,但均可以与char*进行比较,并且比较的是值,而不是地址; 

cout << ( psz == cstr ); 

cout << ( psz == str ); 

cout << ( str == psz ); 

cout << ( cstr == psz );//以上代码返回均为1 

(四) 常用算法 

a) 查找

作用 char* string CString 
查找指定值 strchr 
strstr 
strrstr 
strspn find Find 
第一个匹配的值 fild_first_of FindOneOf 从后面开始查找 ReserveFind 指定匹配方式 find_if

注:find_if中是把范围内的值挨个代入匹配函数直至返回true 

b) 比较 

作用 char* string CString 查找指定值(区分大小写) strcmp 
strncmp 
strcoll 
_strncoll operator< 
operator> 
operator<= 
operator>= 
operator== 
operator!= Collate 

Compare 查找指定值(不区分大小写) _stricmp 
_strnicmp 
_stricoll 
_strnicoll CollateNoCase 

CompareNoCas

注:返回值如果<0则前面的值小于后面的值,反之亦然 

c) 替换

作用 char* string CString 查找指定值 _strset 
_strnset 
replace 
replace_copy 
replace_copy_if 
replace_if Replace

d) 插入

作用 char* string CString 查找指定值 insert Insert
 

e) 增加 作用 char* string CString 动态增加值 strcat push 

append Append 

AppendChar 

AppendFormat


f) 截取

作用 char* string CString 得到部分值 用下标操作 substr Left 

Mid 

Right 

Truncate


g) 移除

作用 char* string CString 移除部份值 remove Remove 移除空白值 RemoveBlanks 

注:此为ATL提供,非C函数 remove_if Trim 

TrimLeft 

TrimRig


h) 转换大小写

作用 char* string CString 转换大小写 _strlwr 

_strupr MakeLower 

MakeUpper


i) 与其他类型转换

作用 char* string CString 转化为数字 atoi 

atod 

atof Format 转化为char* c_str 
GetBuffer 

GetBufferSetLen

j) 格式化

作用 char* string CString 格式化 sprintf Format 


k) 得到长度

作用 char* string CString 
得到长度 strlen length GetLength 得到大小 size GetAllocLength

l) 判断为空

作用 char* string CString 判断是否为空 判断是否==NULL或者第一个字符是否是'\0' empty IsEmpty

m) 重定义大小

作用 char* string CString 重定义大小 realloc 
new resize GetBufferSetLength

n) 释放资源

作用 char* string CString 释放 free 

delete (delete[]) ReleaseBuffer 

ReleaseBufferSetLength 

(五) 安全性> 

CString > string > char*; 

(六) 灵活性 

CString > string >char*; 

(七) 可移植性 

char* = string > CString

posted @ 2015-01-26 09:36  wenluderen  阅读(1541)  评论(0)    收藏  举报