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;
    }
  • 相关阅读:
    POJ 1611 The Suspects
    POJ 2001 Shortest Prefixes(字典树)
    HDU 1251 统计难题(字典树 裸题 链表做法)
    G++ C++之区别
    PAT 乙级 1013. 数素数 (20)
    PAT 乙级 1012. 数字分类 (20)
    PAT 乙级 1009. 说反话 (20)
    PAT 乙级 1008. 数组元素循环右移问题 (20)
    HDU 6063 17多校3 RXD and math(暴力打表题)
    HDU 6066 17多校3 RXD's date(超水题)
  • 原文地址:https://www.cnblogs.com/MrYuan/p/4725020.html
Copyright © 2011-2022 走看看