数值和字符串相互转换(C++ 数据类型转换技巧)
类型转换是将一种类型的值映射为另一种类型的值。进行数据类型的转换。
是在实际代码编写中经常遇到的问题,特别是字符串和其他类型的转换。
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++ 数据类型转换技巧)的更多相关文章
- 第一百二十七节,JavaScript,JSON数据类型转换,数据转换成字符串,字符串转换成数据
第一百二十七节,JavaScript,JSON数据类型转换,数据转换成字符串,字符串转换成数据 学习要点: 1.JSON语法 2.解析和序列化 前两章我们探讨了XML的结构化数据,但开发人员还是觉得这 ...
- 初识 Javascript.02 -- Date日期、Math对象、数据类型转换、字符串、布尔Boolean、逻辑运算符、if else 、三元表达式、代码调试方法、
Date()对象: Date对象用于处理日期和时间. 1.1 Math对象 ◆Math.ceil() 天花板函数 向上取整 只取整数,不足则进1 ◆Math.floor() 地板函数 ...
- JaveScript基础(2)之数据类型转换和常用字符串的操作方法
1.JaveScript数据类型转换: A.转字符串:通过"+"或toString(); PS:如果都是数值类型,'+'会进行求和运算,否则会做字符串连接: var s=2.5;d ...
- LoadRunner脚本编写(6)— 数据类型转换和字符串操作
LoadRunner脚本编写(6)— 数据类型转换和字符串操作 一,数据类型转换 没有使用过C编程的LoadRunner脚本编写者会发现在数据类型转化方面比较困难.下面介绍这方面的知识. 1. 相似函 ...
- 5.单行函数,多行函数,字符函数,数字函数,日期函数,数据类型转换,数字和字符串转换,通用函数(case和decode)
1 多行函数(理解:有多个输入,但仅仅输出1个结果) SQL>select count(*) from emp; COUNT(*) ------------- 14 B 字符函数Lowe ...
- 第三十五节,json数据类型转换字符串模块
在使用json模块时需要先 import json 引入模块 json.dumps()模块函数 功能:将Python数据类型转换成字符串[有参] 使用方法:json.dumps(要转换的数据类型变量) ...
- Java将其他数据类型转换成JSON字符串格式
Student.java package com.demo.servlet; import java.util.List; import java.util.Map; public class Stu ...
- hive数据类型转换、字符串函数、条件判断
http://blog.csdn.net/yimingsilence/article/details/70057638 数据类型转换 同Java语言一样,Hive也包括 隐式转换(implicit c ...
- 生成二维码 加密解密类 TABLE转换成实体、TABLE转换成实体集合(可转换成对象和值类型) COOKIE帮助类 数据类型转换 截取字符串 根据IP获取地点 生成随机字符 UNIX时间转换为DATETIME\DATETIME转换为UNIXTIME 是否包含中文 生成秘钥方式之一 计算某一年 某一周 的起始时间和结束时间
生成二维码 /// <summary>/// 生成二维码/// </summary>public static class QRcodeUtils{private static ...
随机推荐
- Python爬去图片实例,python 爬取图片
# coding:utf-8 import requests import re import time proxies = { "http": "http://124. ...
- Canvas转换为Blob对象并使用Ajax发送
Canvas转换为Blob对象并使用Ajax发送 转换为Blob对象后,可以使用Ajax上传图像文件. 先从canvas获取dataurl, 再将dataurl转换为Blob对象 var dataur ...
- 运行百度语音识别官方iOS demo报错: load offline engine failed: 4001
运行官方BDVRClientSample这个demo(ios版的),demo可以安到手机上,但是点“识别UI”那个按钮后“授权验证失败”.如果点“语音识别”那个按钮,控制台输出:2015-10-23 ...
- PHP写webservice服务端
1) WebService技术介绍 WebService是一种跨编程语言和跨操作系统平台的远程调用技术.仅仅有通过Web Service,client和server才可以自由的用HTTP进行通信.不论 ...
- Entity Framework "There is already an open DataReader associated with this 的解决办法
解决办法: 1,修改连接串,加上MultipleActiveResultSets=true 2, 一次性先把数据读出来 var contacts = from c in db.Contact sele ...
- 汉诺塔(-) java modPow 的用法;
汉诺塔(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的 ...
- 解决错误: ios property has a previous declaration
今天维护一个项目的时候,我新添加了一个库,运行的时候报错了: ios property has a previous declaration 上网查了一下没有找到思路,不过根据提示自己试了一下,原来这 ...
- tensorflow之损失函数
#coding:utf-8 __author__ = 'similarface' import tensorflow as tf sess=tf.Session() #max(features, 0) ...
- poj3041 Asteroids 匈牙利算法 最小点集覆盖问题=二分图最大匹配
/** 题目:poj3041 Asteroids 链接:http://poj.org/problem?id=3041 题意:给定n*n的矩阵,'X'表示障碍物,'.'表示空格;你有一把枪,每一发子弹可 ...
- Azkaban安装配置
描述: azkaban主要用于离线计算任务的调度 说明: 此处Azkaban选择版本为:3.52.0,部署方式为Cluster模式,即支持多Executor计算节点,目前默认安装方式选择在同一台机器上 ...