VC字符串转换小结

最近在做一些关于VC的小东西,经常会遇到字符串处理的问题,狂查CSDN和MSDN,结果并不理想。

在VC编程中经常会遇到字符串转化的问题,现在做一下总结,以方便以后使用。

 

(1) char*转换成CString
  若将char*转换成CString,除了直接赋值外,还可使用CString::Format进行。例如:
         char chArray[] = "Char  test";
         TCHAR * p = _T("Char  test");( 或LPTSTR p = _T("Char  test");)
         CString theString = chArray;
         theString.Format(_T("%s"), chArray);
         theString = p;

 

(2) CString转换成char*

  若将CString类转换成char*(LPSTR)类型,常常使用下列三种方法:

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

       CString theString( (_T("Char test "));
        LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString;

 

  方法二,使用strcpy。例如:

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

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

 

  方法三,使用CString::GetBuffer。
        如果你需要修改 CString 中的内容,它有一个特殊的方法可以使用,那就是 GetBuffer,它的作用是返回一个可写的缓冲指针。
如果你只是打算修改字符或者截短字符串,例如:
       CString s(_T("Char test "));
        LPTSTR p = s.GetBuffer();
        LPTSTR dot = strchr(p, ''.'');
         // 在这里添加使用p的代码
          if(p != NULL)
         *p = _T('/0');
         s.ReleaseBuffer();                     // 使用完后及时释放,以便能使用其它的CString成员函数
         在 GetBuffer 和 ReleaseBuffer 之间这个范围,一定不能使用你要操作的这个缓冲的 CString 对象的任何方法。因为
ReleaseBuffer 被调用之前,该 CString 对象的完整性得不到保障。

 

常规转换

 先定义一些常见类型变量借以说明
                              int i = 100;
                              long l = 2001;
                              float f=300.2;
                              double d=12345.119;
                              char username[]="xx";
                              char temp[200];
                              char *buf;
                              CString str;


                 一、其它数据类型转换为字符串
                              短整型(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);

 

六、variant转化为CString

 

VariantToString(_variant_t varValue)  
{  
   if(varValue.vt!=VT_BSTR)  
   {
     varValue.ChangeType(VT_BSTR); 
   }
 
   return  (char*)_bstr_t(varValue.bstrVal);  
}

注意:加上头文件 #include  "comdef.h"

 

Variant 转化为Long方法

 

VariantToLong(const VARIANT &var)
{
 long r;
 switch(var.vt)
 {
 case VT_UI2://USHORT
  r = var.uiVal;
  break;
 case VT_UI4://ULONG
  r = var.ulVal;
  break;
 case VT_INT://INT
  r = var.intVal;
  break;
 case VT_UINT://UINT
  r = var.uintVal;
  break;
 case VT_I4://LONG
  r = var.lVal;
  break;
 case VT_UI1://BYTE
  r = var.bVal;
  break;
 case VT_I2://SHORT
  r = var.iVal;
  break;
 case VT_R4://FLOAT
  r = (long)var.fltVal;
  break;
 case VT_R8://DOUBLE
  r = (long)var.dblVal;
  break;
 default:
  r = -1;//无法转换该值
  break;
 }
 return r;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值