C++中不同类型数据之间的转换(调用库函数)
来源:互联网 发布:电钢琴 耳机 知乎 编辑:程序博客网 时间:2024/05/21 01:29
C++标准库为我们提供了不少库函数用以支持数据类型的转换,总结了以下几个:
1.sprintf函数
在将各种类型的数据构造成字符串时,sprintf 的功能很强大。由于sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。这也导致sprintf 比printf 有用得多。
sprintf 是个变参函数,定义如下:
int sprintf( char *buffer, const char *format [, argument] ... );
除了前两个参数类型固定外,后面可以接任意多个参数。而它的精华,显然就在第二个参数;
例如:sprintf(s, "%d", 123); //产生"123"
sprintf(s, "%f", 3.1415926); //产生"3.141593"
sprintf(s, "%.2f", i); //错误
sprintf(s, "%.2f", (double)i); //错误
错误原因分析:参数压栈时调用者并不知道跟i相对应的格式控制符是个”%f”。而函数执行时函数本身则并不知道当年被压入栈里的是个整数,于是保存整数i 的那4 个字节就被强行作为浮点数格式来解释了,这样就整个乱套了。
2.stringstream对象
由于数据的类型在编译期就确定了,所以编译器拥有足够的信息来判断需要哪些转换。<sstream>库中声明的标准类就利用了这一点,自动选择所必需的转换。而且,转换结果保存在stringstream对象的内部缓冲中。你不必担心缓冲区溢出,因为这些对象会根据需要自动分配存储空间。
<sstream>库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。另外,每个类都有一个对应的宽字符集版本。简单起见,以stringstream为中心,因为每个转换都要涉及到输入和输出操作。
注意:
(1)<sstream>使用string对象来代替字符数组。这样可以避免缓冲区溢出的危险。而且,传入参数和目标对象的类型被自动推导出来,即使使用了不正确的格式化符也没有危险。
(2)如果打算在多次转换中使用同一个stringstream对象,记住再每次转换前要使用clear()方法;
(3)在多次转换中重复使用同一个stringstream(而不是每次都创建一个新的对象)对象最大的好处在于效率。stringstream对象的构造和析构函数通常是非常耗费CPU时间的。
例子:
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
string D2S(double Input)
{
stringstream Oss;
Oss<<Input;
return Oss.str();
}
double S2D(string Input)
{
double Result;
stringstream Oss;
Oss<<Input;
Oss>>Result;
return Result;
}
int main()
{
double Str_1 = 12345.56789;
string Str_2 = "12345.56789";
cout<<"Double --> String"<<endl;
cout<<D2S(Str_1)<<endl;
cout<<"String --> Double"<<endl;
cout<<S2D(Str_2)<<endl;
}
另外也可以写个适用于各种类型转换的模板
template<class out_type,class in_value> out_type convert(const in_value & t)
{
stringstream stream;
stream<<t;//向流中传值
out_type result;//这里存储转换结果
stream>>result;//向result中写入值
return result;
}
使用convert()方法:
double d;
string salary;
string s=”12.56”;
d=convert<double>(s);//d等于12.56
salary=convert<string>(9000.0);//salary等于”9000“
3.atoi、atof之类的函数
常用的有:atol 、strtol、 strtod 、strtoul。。。用法类似,可能有重载的情况。
例子1:
main()
{
char *a=”-100.23”;
char *b=”200e-2”;
float c;
c=atof(a)+atof(b); //atof :字符串型转换为浮点型
printf(“c=%.2f\n”,c);
}
执行结果:c=-98.23
例子2:
main()
{
char a[]=”1000000000”;
char b[]=”1000000000”;
char c[]=”ffff”;
printf(“a=%d\n”,strtod(a,NULL,10)); //按十进制转换
printf(“b=%d\n”,strtod(b,NULL,2)); //按二进制转换
printf(“c=%d\n”,strtod(c,NULL,16)); //按十六进制转换
}
执行结果:
a=1000000000
b=512
c=65535
- C++中不同类型数据之间的转换(调用库函数)
- C++中不同类型数据之间的转换(不调用库函数)
- C语言中不同类型数据之间的赋值
- 不同类型的数据之间的强制转换
- javascript不同类型数据之间运算的转换
- 不同类型之间的转换
- List中存放不同类型对象之间的转换
- 不同类型数据间的转换
- php不同类型数据的转换
- 不同类型数据间的转换
- 不同类型数据间的转换
- 不同类型数据间的转换
- 不同类型数据间的转换
- 不同类型数据间的转换
- 不同类型数据间的转换
- C# 不同类型数组之间的转换
- C++不同类型字符串之间的相互转换
- CopyMemory不同类型数据之间的复制
- 启动Linux 时候 ora.node2.gsd 的STATE 状态为 UNKNOWN node12
- Server-U配置
- std:string学习
- 多字节字符集
- linux运维常用命令
- C++中不同类型数据之间的转换(调用库函数)
- 关于Samsung S4开发蓝牙4.0应用的资料及官方demo的讨论。
- bat 指定每一周的某一天(比如周五) 执行某一程序(比如飞鸽)
- 使用友盟总结
- QQ聊天记录
- 网络打洞
- C++之this指针与另一种“多态”
- PHP Session 超时的问题
- 关于oracle 安装下的LINUX系统参数的优化