`
thank55789
  • 浏览: 29610 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

c/c++数据类型转换

阅读更多
c/c++数据类型转换1(float,char,string,CString)
      Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。随着计算机工作能力的增强,Unicode也在面世以来的十多年里得到普及。 在非 Unicode 环境下,由于不同国家和地区采用的字符集不一致,很可能出现无法正常显示所有字符的情况。微软公司使用了代码页(Codepage)转换表的技术来过渡性的部分解决这一问题,即通过指定的转换表将非 Unicode 的字符编码转换为同一字符对应的系统内部使用的 Unicode 编码。

     int i = 100;           long l = 2001;           float f=300.2;           double d=12345.119;
     char username[]="程佩君";           char temp[200];           char *buf;           CString str;
    _variant_t v1;           _bstr_t v2;           wchar_t  
       wchar_t是C++的字符数据类型,char是8位字符类型,最多只能包含256种字符,许多外文字符集所含的字符数目超过256个,字符型无法表示。wchar_t数据类型为16位,所能表示的字符数远超char型。
  标准C++中的wprintf()函数以及iostream类库中的类和对象能提供wchar_t宽字符类型的相关操作。例如:
  #include <iostream>
  using namespace std;
  void main()
  {
  locale loc( "chs" );//定义“区域设置”为中文方式
  wcout.imbue( loc );//载入中文字符输入方式
  wchar_t str[]=L"中国";//定义宽字符数组,注意L是大写
  wcout<<str<<endl;//显示宽字符数组,下同
  wprintf(str);
  system("pause");
  }

一、其它数据类型转换为字符串string
1)短整型(int)
itoa(i,temp,10);///将i转换为字符串放入temp中,最后一个数字表示十进制
itoa(i,temp,2); ///按二进制方式转换
2)长整型(long)
ltoa(l,temp,10);
3)浮点数(float,double)
用fcvt可以完成转换,这是MSDN中的例子:
int decimal, sign;
char *buffer;
double source = 3.1415926535;
buffer = _fcvt( source, 7, &decimal, &sign );
运行结果:source: 3.1415926535 buffer: '31415927' decimal: 1 sign: 0
decimal表示小数点的位置,sign表示符号:0为正数,1为负数
4)CString变量
str = "2008北京奥运";
buf = (LPSTR)(LPCTSTR)str;
5)BSTR变量
BSTR bstrValue = ::SysAllocString(L"程序员");
char * buf = _com_util::ConvertBSTRToString(bstrValue);
SysFreeString(bstrValue);
AfxMessageBox(buf);
delete(buf);
6)CComBSTR变量
CComBSTR bstrVar("test");
char *buf = _com_util::ConvertBSTRToString(bstrVar.m_str);
AfxMessageBox(buf);
delete(buf);
7)_bstr_t变量
_bstr_t类型是对BSTR的封装,因为已经重载了=操作符,所以很容易使用
_bstr_t bstrVar("test");
const char *buf = bstrVar;///不要修改buf中的内容
AfxMessageBox(buf);

通用方法(针对非COM数据类型)
用sprintf完成转换
char buffer[200];
char c = '1';
int   i = 35;
long j = 1000;
float f = 1.7320534f;
sprintf( buffer, "%c",c);
sprintf( buffer, "%d",i);
sprintf( buffer, "%d",j);
sprintf( buffer, "%f",f);

二、字符串string转换为其它数据类型
temp="123456";
1)短整型(int)
i = atoi(temp);
2)长整型(long)
l = atol(temp);
3)浮点(double)
d = atof(temp);
string s; d= atof(s.c_str());
4)BSTR变量
BSTR bstrValue = ::SysAllocString(L"程序员");
...///完成对bstrValue的使用
SysFreeString(bstrValue);
5)CComBSTR变量
CComBSTR类型变量可以直接赋值
CComBSTR bstrVar1("test");
CComBSTR bstrVar2(temp);
6)_bstr_t变量
_bstr_t类型的变量可以直接赋值
_bstr_t bstrVar1("test");
_bstr_t bstrVar2(temp);

7)string转char*

string 是c++标准库里面其中一个,封装了对字符串的操作
把string转换为char* 有3中方法:
1。data
如:
string str="abc";
char *p=str.data();
2.c_str
如:string str="gdfd";
    char *p=str.c_str();
3 copy
比如
string str="hello";
char p[40];
str.copy(p,5,0); //这里5,代表复制几个字符,0代表复制的位置
*(p+5)='\0'; //要手动加上结束符
cout < <p;

三、1. 其它数据类型转换到CString
使用CString的成员函数Format来转换,例如:
整数(int)           str.Format("%d",i);
浮点数(float)    str.Format("%f",i); doubledb = 777.999; str.Format("%.8f",db); 保留8位小数
字符串指针(char *)可以直接赋值str = username;
对于Format所不支持的数据类型,可以通过上面所说的关于其它数据类型转化到char *的方法先转到char *,然后赋值给CString变量。
注意:MFC智能设备string转Cstring
   string s=”123456”;   CString cstr;   cstr=s.c_str();

   2.CString 转double或float

(1)db = atof((LPCTSTR)str);

(2)通过自定义函数实现

void CStringToFloat(CString cstr ,double &f )//void CStringToFloat(CString cstr ,float&f )
{
int nLength = cstr.GetLength();
int nBytes = WideCharToMultiByte(CP_ACP,0,cstr,nLength,NULL,0,NULL,NULL);
char* pContentBuff = new char[ nBytes + 1];
memset(pContentBuff,0,nBytes+1);
WideCharToMultiByte(CP_OEMCP, 0, cstr, nLength, pContentBuff, nBytes, NULL, NULL);
pContentBuff[nBytes] = 0;
f = atof(pContentBuff);
}

   3.CString转int

CString如何转成int网上的介绍都是用atoi函数,但是CString 内部存储的是wchar_t 类型的字符,每个字符占两个字节,atoi的参数是char*,每个字符占一个字节 ,如果强制转换成char*,由于高位字节是空,所以就转成了只有第一个字符的串,这样是不对的.应该用_wtoi函数,这个函数的参数是wchar_t*,示例如下:
CString str("123");
int num = _wtoi(str);
同样,也有_wtof(),_wtol()等函数可供将CString 转成不同的数值类型.

   4. 平台VC2005,使用Unicode字符集。CString类型转换为char*或char[ ]
使用以前转换CString的方法或者网上别人的指导用法,都失效了
(1.strcpy_s( pchar, sizeof(pchar), mCString.GetBuffer(mCString.GetLength()) );不行,mCString.GetBuffer()返回的是wchar_t数组,使用Unicode字符集时,wchar_t无法自动转换为char*.
(2.strcpy_s(pchar, sizeof(pchar), (LPCSTR)_bstr_t(mCString));不行,"_bstr_t找不到识别符"
(3.char *pch = (T2A)(LPSTR)(LPCTSTR)mCString; 也不行,"T2A是没声明的标识符",我补加上相应头文件AtlConv.h或AtlBase.h等的,也还是报错不改。
(4.char *pch = (LPSTR)(LPCTSTR)mCString; 这样没有报错,但pch只能获得CString的第一个字符而已,第一个换成(char*),也只能获取第一个字符。
(5.CString.GetBuffer(CString.GetLength())不行。w_char*不能转为_char*。

用下面的函数
wstring MultCHarToWideChar(string str)
{
//获取缓冲区的大小,并申请空间,缓冲区大小是按字符计算的
int len=MultiByteToWideChar(CP_ACP,0,str.c_str(),str.size(),NULL,0);
TCHAR *buffer=new TCHAR[len+1];
//多字节编码转换成宽字节编码
MultiByteToWideChar(CP_ACP,0,str.c_str(),str.size(),buffer,len);
buffer[len]='\0';//添加字符串结尾
//删除缓冲区并返回值
wstring return_value;
return_value.append(buffer);
delete []buffer;
return return_value;
}
string WideCharToMultiChar(wstring str)
{
string return_value;
//获取缓冲区的大小,并申请空间,缓冲区大小是按字节计算的
int len=WideCharToMultiByte(CP_ACP,0,str.c_str(),str.size(),NULL,0,NULL,NULL);
char *buffer=new char[len+1];
WideCharToMultiByte(CP_ACP,0,str.c_str(),str.size(),buffer,len,NULL,NULL);
buffer[len]='\0';
//删除缓冲区并返回值
return_value.append(buffer);
delete []buffer;
return return_value;
}
于是使用
string mstring = WideCharToMultiChar( (LPCTSTR)mCString );
strcpy_s( pach, sizeof(pach), mstring.c_str() );
转换成功!


四、BSTR、_bstr_t与CComBSTR
CComBSTR 是ATL对BSTR的封装,_bstr_t是C++对BSTR的封装,BSTR是32位指针,但并不直接指向字串的缓冲区。
char *转换到BSTR可以这样:
BSTR b=_com_util::ConvertStringToBSTR("数据");///使用前需要加上comutil.h和comsupp.lib
SysFreeString(bstrValue);
反之可以使用char *p=_com_util::ConvertBSTRToString(b);delete p;

CComBSTR与_bstr_t对大量的操作符进行了重载,可以直接进行=,!=,==等操作,所以使用非常方便。

五、VARIANT 、_variant_t 与 COleVariant
VARIANT的结构可以参考头文件VC98\Include\OAIDL.H中关于结构体tagVARIANT的定义。
对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子:
VARIANT va;
int a=2001;
va.vt=VT_I4;///指明整型数据
va.lVal=a; ///赋值
对于不马上赋值的VARIANT,最好先用Void VariantInit(VARIANTARG FAR* pvarg);进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系:
Byte bVal; // VT_UI1.
Short iVal; // VT_I2.
long lVal; // VT_I4.
float fltVal; // VT_R4.
double dblVal; // VT_R8.
VARIANT_BOOL boolVal; // VT_BOOL.
SCODE scode; // VT_ERROR.
CY cyVal; // VT_CY.
DATE date; // VT_DATE.
BSTR bstrVal; // VT_BSTR.
DECIMAL FAR* pdecVal // VT_BYREF|VT_DECIMAL.
IUnknown FAR* punkVal; // VT_UNKNOWN.
IDispatch FAR* pdispVal; // VT_DISPATCH.
SAFEARRAY FAR* parray; // VT_ARRAY|*.
Byte FAR* pbVal; // VT_BYREF|VT_UI1.
short FAR* piVal; // VT_BYREF|VT_I2.
long FAR* plVal; // VT_BYREF|VT_I4.
float FAR* pfltVal; // VT_BYREF|VT_R4.
double FAR* pdblVal; // VT_BYREF|VT_R8.
VARIANT_BOOL FAR* pboolVal; // VT_BYREF|VT_BOOL.
SCODE FAR* pscode; // VT_BYREF|VT_ERROR.
CY FAR* pcyVal; // VT_BYREF|VT_CY.
DATE FAR* pdate; // VT_BYREF|VT_DATE.
BSTR FAR* pbstrVal; // VT_BYREF|VT_BSTR.
IUnknown FAR* FAR* ppunkVal; // VT_BYREF|VT_UNKNOWN.
IDispatch FAR* FAR* ppdispVal; // VT_BYREF|VT_DISPATCH.
SAFEARRAY FAR* FAR* pparray; // VT_ARRAY|*.
VARIANT FAR* pvarVal; // VT_BYREF|VT_VARIANT.
void FAR* byref; // Generic ByRef.
char cVal; // VT_I1.
unsigned short uiVal; // VT_UI2.
unsigned long ulVal; // VT_UI4.
int intVal; // VT_INT.
unsigned int uintVal; // VT_UINT.
char FAR * pcVal; // VT_BYREF|VT_I1.
unsigned short FAR * puiVal; // VT_BYREF|VT_UI2.
unsigned long FAR * pulVal; // VT_BYREF|VT_UI4.
nt FAR * pintVal; // VT_BYREF|VT_INT.
unsigned int FAR * puintVal; //VT_BYREF|VT_UINT.
_variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。
使用时需加上#include <comdef.h>
例如:
long l=222;
ing i=100;
_variant_t lVal(l);
lVal = (long)i;
COleVariant的使用与_variant_t的方法基本一样,请参考如下例子:
COleVariant v3 = "字符串", v4 = (long)1999;
CString str =(BSTR)v3.pbstrVal;


sstream>库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。另外,每个类都有一个对应的宽字符集版本。简单起见,我主要以stringstream为中心,因为每个转换都要涉及到输入和输出操作。示例1示范怎样使用一个stringstream对象进行从

string到int类型的转换

注意,<sstream>使用string对象来代替字符数组。这样可以避免缓冲区溢出的危险。而且,传入参数和目标对象的类型被自动推导出来,即使使用了不正确的格式化符也没有危险。

示例1:

std::stringstream stream;

string result="10000";
int n = 0;
stream << result;
stream >> n;//n等于10000

int到string类型的转换

string result;
int n = 12345;
stream << n;
result =stream.str();// result等于"12345"

重复利用stringstream对象

如果你打算在多次转换中使用同一个stringstream对象,记住再每次转换前要使用clear()方法,在多次转换中重复使用同一个stringstream(而不是每次都创建一个新的对象)对象最大的好处在于效率。stringstream对象的构造和析构函数通常是非常耗费CPU时间的。经试验,单单使用clear()并不能清除stringstream对象的内容,仅仅是了该对象的状态,要重复使用同一个stringstream对象,需要使用str()重新初始化该对象。

示例2:

std::stringstream strsql;
for (int i= 1; i < 10; ++i)
{
strsql << "insert into test_tab values(";
   strsql << i << ","<< (i+10) << ");";
   std::string str = strsql.str(); // 得到string
   res = sqlite3_exec(pDB,str.c_str(),0,0, &errMsg);

   std::cout << strsql.str() << std::endl;

   strsql.clear();
   strsql.str("");
}

分享到:
评论

相关推荐

    c/c++数据类型转换汇总

    c/c++ 数据类型间的相互转换 希望你可以通过该资料能够正确使用他们

    Delphi 与 C/C++ 数据类型对照表

    ### Delphi 与 C/C++ 数据类型对照表详解 #### 概述 本文将详细介绍Delphi与C/C++之间的数据类型对照关系。这对于在两种语言之间进行编程转换或需要了解两者差异的人来说非常重要。 #### 整型数据类型 - **ShorInt...

    C语言/C++数据类型介绍

    ### C语言/C++数据类型详解:开启编程世界的大门 #### 整型(Integers) 在C语言和C++中,整型是最基础的数据类型之一,用于存储整数值。通过不同的修饰符,整型可以细分为多种类型,满足不同场景的需求。 **1.1 ...

    从缺陷中学习C/c++

    1. **深入理解C/C++特性**:熟悉语言的底层机制,如内存模型、指针操作、类型转换等,是避免陷阱的基础。 2. **代码审查与测试**:定期进行代码审查,利用静态分析工具检查潜在的缺陷,以及实施严格的单元测试和...

    matlab与c/c++混合编程中VARIANT与c++数据类型转换类

    在本篇知识讲解中,我们将聚焦于“matlab与C/C++混合编程中VARIANT与C++数据类型转换类”的主题,探讨如何在VC++环境下,通过COM组件与MATLAB进行数据交互,并特别关注VARIANT数据类型与C++基本数据类型的转换方法。...

    Oracle9iPro*C/C++编程指南源码

    5. **类型映射**:Pro*C/C++提供了数据库数据类型与C/C++数据类型的映射,使得数据在两者之间能顺畅转换。 6. **连接管理**:通过oci.h头文件提供的接口,开发者可以创建、管理数据库连接,执行SQL语句,以及进行...

    如何将C/C++翻译成delphi

    虽然Delphi可以使用C/C++编写的库和组件,但是在将C/C++程序转换为Delphi时,需要了解Delphi中的指针和类型系统的差异。 Delphi中的指针与C/C++中的指针有所不同。Delphi中的指针是Object Pascal语言的组成部分,...

    精通Matlab与C/C++混合程序设计(第三版) 配套光盘

    3. **数据类型转换**:在Matlab与C/C++之间传递数据时,理解数据类型的转换至关重要。例如,Matlab的复数、矩阵等数据类型在C/C++中如何表示,以及如何有效地在两者之间转换。 4. **内存管理**:由于Matlab和C/C++...

    C/C++ Windows移植到LINUX 的数据类型转换总结

    c/c++ Windows移植到LINUX 的数据类型转换总结,都在WinToLinux.h文件中,需要时直接引入此头文件即可,很实用。

    C++数据类型转换

    C++ 数据类型转换 C++ 编程语言中,数据类型转换是非常重要的一方面。不同的数据类型之间可以相互转换,以满足不同的编程需求。在本文中,我们将详细介绍 C++ 数据类型之间的相互转换,包括基本数据类型、CString、...

    Oracle 11g Pro C/C++编程艺术

    它能够自动地将数据库中的数据类型转换为对应的C/C++数据类型,从而避免了类型不匹配的问题。例如,数据库中的VARCHAR2类型会被映射为C/C++中的char*类型。 #### 三、Oracle Pro*C/C++与数据库的连接 **3.1 连接...

    gSOAP C/C++ 开发WebService

    1. **SOAP消息处理**:gSOAP自动处理SOAP消息的编码和解码,将C/C++数据类型转换为XML格式,反之亦然。它支持各种SOAP版本,包括1.1和1.2,并能够处理WS-I基本配置兼容性轮廓,确保跨平台互操作性。 2. **代码生成*...

    C/C++ 和 Matlab 类型转换器:C/C++ 类型(STL、openCV)和 Matlab 矩阵(编译或运行时)之间的双向转换-matlab开发

    -&gt; Matlab 类型转换器简介:C/C++ 类型(本机、STL、openCV...)和 Matlab 矩阵(编译或运行时)之间的双向转换。 关键词:C、C++、mxArray、OpenCV、IplImage、迭代器、mex、引擎 描述: 考虑以下场景(尤其是在...

    《精通Oracle 10g Pro*C/C++编程》源代码与学习笔记

    2. **数据类型映射**:在C/C++中使用Oracle的数据类型,如NUMBER、DATE、VARCHAR2等,需要理解它们如何映射到C/C++的原始数据类型,并在Pro*C中正确声明。 3. **游标和绑定变量**:游标是Oracle中的一个关键概念,...

    MATLAB C/C++, Fortran, Java, and Python API Reference

    - 支持在C/C++程序中运行MATLAB工作空间中的函数,以及将C/C++数据类型转换为MATLAB格式。 2. **MATLAB Fortran API**: - 同样允许Fortran程序与MATLAB引擎通信,调用MATLAB函数库。 - 针对Fortran语言的特性,...

    android C/C++ JNI普通数据类型 测试工程

    在本文中,我们将深入探讨JNI中的数据类型转换以及如何在C/C++代码和Java代码之间使用它们。 首先,JNI提供了一套与Java数据类型相对应的C数据类型。例如,Java的`int`在JNI中对应的是`jint`,`float`对应`jfloat`...

    MATLAB与C/C++、FORTRAN语言混合编程[整理].pdf

    - 熟悉MATLAB的数据类型和C/C++、FORTRAN的数据类型转换规则,避免因类型不匹配导致的错误。 - 理解MATLAB与C/C++、FORTRAN之间的内存管理差异,特别是指针和数组的使用。 - 注意多线程和并发处理的问题,因为MATLAB...

    高质量C/C++编程指南

    3. **类型转换**:类型转换是C/C++中常见的操作,但不正确的转换可能导致数据丢失或运行时错误。指南会讨论隐式转换和显式转换的规则,以及何时使用static_cast, dynamic_cast, reinterpret_cast和const_cast。 二...

Global site tag (gtag.js) - Google Analytics