zoukankan      html  css  js  c++  java
  • VC字符串转换常用函数

    最近在做一些关于VC的ActiveX小插件,经常会遇到字符串处理的问题,狂查CSDN和MSDN,结果并不理想。先说明一下,相关处理函数在VC++6.00测试通过。也许很多人不能理解,现在都什么年代了,还用VC6.0,其实VC开发插件有一个好处就是部署的时候方便一些,不用考虑浏览器端用户是否安装了.net Framework。那个.net Framework随着推出新版本越来越大,要让用户花那么多时间去安装那个庞然大物,而实际用到的东西却很少很少,这样很多人会不干的。另外,服务端的是java开发的,要加上.net更加不可能。因此,VC开发的东西就不用担心这些东西。说多了。。。。。

    在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('');
    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;
    }
  • 相关阅读:
    深浅拷贝的区别
    vue中动态加载组件
    一些工具软件
    echarts 自传作品入口
    Echarts progress 设置背景颜色
    Echarts柱状图,柱子设置不一样的渐变色
    .net 控制台学习笔记 一、控制台程序的异常捕获
    IdentityServer4实战:自定义用户名和密码校验
    IdentityServer4实战:Token 中返回用户属性
    IdentityServer4实战:持久化 Resource
  • 原文地址:https://www.cnblogs.com/MrYuan/p/4725020.html
Copyright © 2011-2022 走看看