类型转换是将一种类型的值映射为另一种类型的值。进行数据类型的转换。
是在实际代码编写中经常遇到的问题,特别是字符串和其他类型的转换。

1.将字符串转换为整数

(1).转换函数
// 双精度函数
double atof(
       const char *string
   );
   double _wtof(
        const wchar_t *string
   );
   自适应
   TCHAR: _tstof 、 _ttof
   VS2005:_atof_l 、_wtof_l 、 _atodbl 、 _atodbl_l
  
   // 整型函数
   int atoi(
        const char *string
   );
   _int64 _atoi64(
         const char *string
   );
   int _wtoi(
         const wchar_t *string
   );
   _int64 _ wtoi64(
         const char *string
   );
   自适应
   TCHAR:_tstoi 、 _ttoi 、_tstoi64 、_ttoi64
   VS2005:_atoi_l 、 _wtoi_l 、_atoi64_l 、_wtoi64_l

//长整形函数
   long atol(
         const char * string
   );
   long _wtol(
          const wchar_t *string
   );
    自适应
   TCHAR:_tstoi 、_ttoi
   VS2005:_atoi_l 、_wtoi_l

可参考:http://blog.sina.com.cn/s/blog_4135af570100b0d9.html

(2).代码参考
   Cstring ting ="1234";
   int num = atoi(ting);
   num的值为1234.
   CString ting = "1234 ";
   double num = atof(ting);
   最终结果:num值为 1234.0000000000000
  
   2.int 转换为字符串
   cahr *_itoa(
         int value,
         char *string,
         int radix
     );
     char *_i64toa(
         _int64 value,
         char *string,
         int radix
      );
      char * _ui64toa(
         unsigned _int64 value,
         char *string,
         int radix
      );
      wchar_t * _itow(
         int value,
         wchar_t *string,
         int radix
       );
       wchar_t * _i64tow(
          _int64 value,
          wchar_t *string,
          int radix
        );
        wchar_t * _ui64tow(
           unsigned _int64 value,
           wchar_t *string,
           int radix
         );
         参数的意义:value 是指要转换的整数,sring 是用来存放转换后结果的便利,
         radix是用来说明转换成几进制的数据,默认值是十进制数的。
         转换的进制范围是二进制到三十六进制。 示例代码:
           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 转换为字符串
  
         char *_ltoa( long value,char *string, int radix );
         wchar_t *_ltow( long value, wchar_t *string, int radix );
         其中,参数 value 为被转换的值,参数string为字符串缓冲区,radix为进制。
         代码参考:
         ling l = 100; char temp[10];
         memset(temp,0,10);
         ltoa(l,temp,10);
        
   4.double 转换为字符串
  
       char *_fcvt( double value, int count, int *dec, int *sign );
       其中参数value 为双精度数,参数count为转换的小数点后面的位数,dec表示小数点的位置,
       sign 表示符号。代码参数如下
       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)
        代码参考:
        #include<stdlib.h>
        #include<stdio.h>
        
         void main( void )
         {
             char *s; dobule x; int i; long l;
            
             s = " -2309.12E-15";   // 测试atof
             x = atof(s);
             printf( "atof test:ASCII string: %s\tfloat: %e\n", s , x );
            
             s= "7.8912654773d210"; // 测试atof
             x = atof(s);
             printf( "atof test: ASCII string: %s\tfloat: %e\n", s, x);
            
             s = " -9885 pigs"; // 测试atoi
             i = atoi(s);
             printf( "atoi test:ASCII string:%s\t\tinteger: %d\n", s, i);
            
             s = "98854 dollars"; // 测试atol
             l = atol(s);
             printf( "atoi test:ASCII string:%s\t\tlong: %ld\n", s, l);
          }
          输出结果:
        atof test:ASCII string: -2309.12E-15   float:-2.309120e-012
        atof test:ASCII string: 7.8912654773d210   float:7.891265E+210
        atof test:ASCII string: -9885 pigs   integer:-9885
        atof test:ASCII string: 98854 dollars long:98854
    
    9. char*和CString的相互转换
   
          CString 饱含了3个值:指向某个数据缓冲区的指针、该缓冲区中有效的字符记数
          (它是不可存取的,是位于CString 地址之下的一个隐藏区域)及一个缓冲区长度。
          有效字符数的大小可以是从0到该缓冲最大长度值减1之间的任何数(因为字符串结尾有一个NULL字符)。
          (1) char* 转换为 CString
             ☆直接赋值
             ☆利用格式化转换
              CString strConvert;
              TCHAR* P = _T("this is a chTostring test ");
              strConvert = p;                      // 直接赋值
              strConvert.Format("%s",p);    // 格式化
          (2) CString 转换为 char*
               ☆强制类型转换为LPCTSTR
               CString theString((_T("Char test "));
               LPTSTR lpsz = (LPTSTR) (LPCTSTR)theString;
               ☆使用strcpy
               CString theString( (_T("Char test "));
               LPTSTR lpsz = new TCHAR[theString.GetLength()+1];
               _tcscopy(lpsz, theSting);
           需要说明的是, strcpy(或可移植的_tcscpy)的第二参数是const wcahr_t*(Unicode)
           或const char*(ANSI),系统编译器将会自动对其进行转换。
           (3)使用GetBuffer
               如果需要修改CString中的内容,它有一个特殊的方法可以使用,哪就是GetBuffer,
               它的作用是返回一个可写的缓冲指针。如果只是打算修改字符或者截短字符串,
               例如:
               CString s(_T("Char test "));
               LPTSTR p = s.GetBuffer();
               // 添加P的代码
               s.ReleaseBuffer()   // 使用完后及时释放。
   
     10.CString与BSTR的相互转换
    
             (1).CString 转换为 BSTR
             调用CString 对象的AllocSysString 方法将CString转化成BSTR,如:
              CString str = "this is a test ";
              BSTR b = str.AllosysString();
              str.FreeSystring();   // 最后不要忘记了释放
             (2).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;
              }
        
   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 a test", v4 = (long)1999;
            CString str = (BSTR)v3.pbstrVal;
            long i = v4.lVal;

数值和字符串相互转换(C++ 数据类型转换技巧)的更多相关文章

  1. 第一百二十七节,JavaScript,JSON数据类型转换,数据转换成字符串,字符串转换成数据

    第一百二十七节,JavaScript,JSON数据类型转换,数据转换成字符串,字符串转换成数据 学习要点: 1.JSON语法 2.解析和序列化 前两章我们探讨了XML的结构化数据,但开发人员还是觉得这 ...

  2. 初识 Javascript.02 -- Date日期、Math对象、数据类型转换、字符串、布尔Boolean、逻辑运算符、if else 、三元表达式、代码调试方法、

    Date()对象: Date对象用于处理日期和时间. 1.1 Math对象  ◆Math.ceil()   天花板函数    向上取整  只取整数,不足则进1 ◆Math.floor()  地板函数 ...

  3. JaveScript基础(2)之数据类型转换和常用字符串的操作方法

    1.JaveScript数据类型转换: A.转字符串:通过"+"或toString(); PS:如果都是数值类型,'+'会进行求和运算,否则会做字符串连接: var s=2.5;d ...

  4. LoadRunner脚本编写(6)— 数据类型转换和字符串操作

    LoadRunner脚本编写(6)— 数据类型转换和字符串操作 一,数据类型转换 没有使用过C编程的LoadRunner脚本编写者会发现在数据类型转化方面比较困难.下面介绍这方面的知识. 1. 相似函 ...

  5. 5.单行函数,多行函数,字符函数,数字函数,日期函数,数据类型转换,数字和字符串转换,通用函数(case和decode)

     1  多行函数(理解:有多个输入,但仅仅输出1个结果) SQL>select count(*) from emp; COUNT(*) ------------- 14 B 字符函数Lowe ...

  6. 第三十五节,json数据类型转换字符串模块

    在使用json模块时需要先 import json 引入模块 json.dumps()模块函数 功能:将Python数据类型转换成字符串[有参] 使用方法:json.dumps(要转换的数据类型变量) ...

  7. Java将其他数据类型转换成JSON字符串格式

    Student.java package com.demo.servlet; import java.util.List; import java.util.Map; public class Stu ...

  8. hive数据类型转换、字符串函数、条件判断

    http://blog.csdn.net/yimingsilence/article/details/70057638 数据类型转换 同Java语言一样,Hive也包括 隐式转换(implicit c ...

  9. 生成二维码 加密解密类 TABLE转换成实体、TABLE转换成实体集合(可转换成对象和值类型) COOKIE帮助类 数据类型转换 截取字符串 根据IP获取地点 生成随机字符 UNIX时间转换为DATETIME\DATETIME转换为UNIXTIME 是否包含中文 生成秘钥方式之一 计算某一年 某一周 的起始时间和结束时间

    生成二维码 /// <summary>/// 生成二维码/// </summary>public static class QRcodeUtils{private static ...

随机推荐

  1. Lintcode---二叉树的层次遍历(原型)

    给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问) 您在真实的面试中是否遇到过这个题? Yes 样例 给一棵二叉树 {3,9,20,#,#,15,7} : 3 / \ 9 20 / \ 15 ...

  2. MySQL之mysql客户端工作的批处理一些使用手法

    通常我们会用mysql这个客户端程序来连接mysql库.这个通常是工作在交互式模式下的.如我们连接上mysql并执行如下操作: mysql -uroot -h127. -P3306 Welcome t ...

  3. Jetty - Handler源码分析

    1. 描述 基于Jetty-9.4.8.v20171121. Handler是Jetty服务处理器,用户Server处理HTTP请求. Handler可以做如下处理: (1)完全生成HTTP响应: ( ...

  4. JS根据时间内容分组代码

    let newArr = []; res.data.data.forEach((address, i) => { let index = -1; let newDates = Date.pars ...

  5. Mybatis设置超时时间

    Mybatis设置超时时间 mybatis如果不指定,默认超时时间是不做限制的,默认值为0.mybatis sql配置超时时间有两种方法: 1.全局配置 在mybatis配置文件的settings节点 ...

  6. CentOS/Linux 网卡设置 IP地址配置永久生效

    CentOS/Linux下设置IP地址 1.临时生效设置 1.1修改IP地址 #ifconfig eth0 192.168.100.100 1.2修改网关地址 #route add default g ...

  7. php调用C代码的方法详解和zend_parse_parameters函数详解

    php调用C代码的方法详解 在php程序中需要用到C代码,应该是下面两种情况: 1 已有C代码,在php程序中想直接用 2 由于php的性能问题,需要用C来实现部分功能   针对第一种情况,最合适的方 ...

  8. The Ball Puzzle

    自己做的小游戏 google play store: https://play.google.com/store/apps/details?id=com.ffipp.theBall app store ...

  9. Risk UVA - 12264 拆点法+最大流+二分 最少流量的节点流量尽量多。

    /** 题目:Risk UVA - 12264 链接:https://vjudge.net/problem/UVA-12264 题意:给n个点的无权无向图(n<=100),每个点有一个非负数ai ...

  10. Storm学习笔记——安装配置

    1.安装一个zookeeper集群 2.上传storm的安装包,解压 3.修改配置文件conf/storm.yaml #所使用的zookeeper集群主机storm.zookeeper.servers ...