C++字符串和基本类型转换的各种方法总结
来源:互联网 发布:卖软件代理 编辑:程序博客网 时间:2024/05/16 05:43
一、概述
1、C++中提供了字符串到基本类型转换的函数,在Windows下也提供了对应的基本类型到字符串转换的函数(在Linux没有,所以需要跨平台时不能使用)。
2、字符串到基本类型转换的接口包括atoi(字符串转int),atol(字符串转long),_atoi64(字符串转long long,注意前面有下滑线),atof(字符串转double);非数字字符串转换时,不会抛异常或奔溃。
3、Windows基本类型转换到字符串可以用itoa(int转字符串),ltoa(long转字符串),_i64toa(long long转字符串),没有ftoa函数,转换的时候要保证传入的字符数组空间足够,否则不会报错,但会写坏其他的内存值。
4、可以用sprintf和stringstream来做基本类型转换到字符串,这个是跨平台的。
5、可以用boost的lexical_cast来做各种类型间转换,包括基本类型之间。
二、字符串到基本类型转换注意点
字符串到基本类型转换时,如果字符串不符合转换到的类型格式,也能进行转换。
以atoi为例,规则如下:
1、如果字符串是一个整数,那么正确转换。 2、如果包含不能非数字,去掉非数字字符后面的所有字符。 3、如果字符是一个浮点数,则丢弃小数部分。 4、如果大于最大值,转换成最大值,如果小于最小值,转换成最小值。
下面是一个测试样例。
void test(){ int a = atoi("12"); int b = atoi("32.2"); int c = atoi("234232423423423"); int d = atoi("df342sdfsf"); int e = atoi("3422342ddd24"); printf("%d %d %d %d %d",a,b,c,d,e);}
输出结果如下:
12 32 2147483647 0 3422342
三、Windows基本类型转换到字符串
Windows基本类型转换到字符串时,如果传入的字符数组空间不足,不会截断,这会导致写坏不该写的内存空间,所以是比较危险的。
下面是一个测试样例。
void test(){ int a1 = 1000000000; char a0Str[1]; char a1Str[1]; a0Str[0] = ','; printf("%c\n",a0Str[0]); itoa(a1,a1Str,2); //2表示转换成2进制,这里可以填任意进制 printf("%c\n",a0Str[0]); printf("%s\n",a1Str);}
输出结果如下:
,1111011100110101100101000000000
四、用sprintf将基本类型转成字符串
sprintf对基本类型转换到字符串时,如果传入的字符数组空间不足,不会截断,这会导致写坏不该写的内存空间,所以需要保证分配足够的数组空间。
void test(){ int t1 = 1000; long long t2 = 234324234234234; float t3 = 100.234f; double t4 = 3242342.323242324; char tc1[15]; char tc2[30]; char tc3[15]; char tc4[50]; sprintf(tc1,"%d", t1); printf("%s\n", tc1); sprintf(tc2,"%lld", t2); printf("%s\n", tc2); sprintf(tc3,"%f", t3); printf("%s\n", tc3); sprintf(tc4,"%lf", t4); printf("%s\n", tc4);}
输出结果如下
1000
234324234234234
100.234001
3242342.323242
五、用stringstream将基本类型转成字符串
stringstream对基本类型转换到字符串时,不会出现sprintf的问题,内部使用的std::string来存储,效率上会低一些。注意,double输出采用的是科学计数法。
void test(){ int t1 = 1000; long long t2 = 234324234234234; float t3 = 100.234f; double t4 = 3242342.323242324; stringstream stream1; stringstream stream2; stringstream stream3; stringstream stream4; stream1 << t1; printf("%s\n", stream1.str().c_str()); stream2 << t2; printf("%s\n", stream2.str().c_str()); stream3 << t3; printf("%s\n", stream3.str().c_str()); stream4 << t4; printf("%s\n", stream4.str().c_str());}
输出结果如下
1000
234324234234234
100.234
3.24234e+006
六、用lexical_cast做基本类型、字符串间转换
lexical_cast支持类型间互转,不过不能将基本类型直接转成char[],需要先转成string,再转成char[]。而且lexical_cast在类型不能转换时,会抛出异常。
void test(){ float t = 100.234f; string s = "343.323"; try { printf("%s\n", boost::lexical_cast<string>(t).c_str()); printf("%f\n", boost::lexical_cast<float>(s)); printf("%.10lf %.10f\n",boost::lexical_cast<double>(t),t); } catch (boost::bad_lexical_cast* e) { printf("%s\n",e->what()); }}
输出结果如下
100.234001343.322998100.2340011597 100.2340011597
七、总结
1、做字符串到基本类型转换时,可以采用atoi,atof等函数,但需要注意字符串和要转换的类型不符合时,也能转换,用lexical_cast函数则要求能正确转换,否则会抛出异常,对异常需要做处理。
2、做基本类型到字符串转转换时,可以用sprintf,stringstream,lexical_cast,不建议用非标准的itoa函数。sprintf适合转成C风格字符串,但需要分配足够的缓冲区,否则会写坏其他内存,而lexical_cast不存在这个问题,但不能直接转换成char[],在没用boost库的时候可以采用stringstream。
3、lexical_cast还能支持基本类型间的互转,在将double,float互转不会报错,但long long 转 int时,如果超出int的范围会抛异常,而float转int时,当转换的误差超过一定值也会抛异常。
0 0
- C++字符串和基本类型转换的各种方法总结
- java基本类型和字符串的转换
- 字符串和基本类型之间的转换
- Java:基本类型和字符串的转换
- 总结c/c++中各种基本数据类型转换方法
- 各种字符串类型的转换
- c#.net函数和方法集(各种值类型转换)
- c/c++各种字符、字符串类型转换
- c/c++各种字符、字符串类型转换
- c/c++各种字符、字符串类型转换
- java中基本类型和字符串类型之间的转换
- MFC下的各种字符串类型和相互转换
- MFC下的各种字符串类型和相互转换
- MFC下的各种字符串类型和相互转换
- MFC下的各种字符串类型和相互转换
- 各种基本类型与string的转换
- java 各种基本类型之间的转换
- (JAVA初级) 字符串和基本类型的转换
- 一步一步掌握Javascript中的原型与原型链
- bzoj 2669
- mongo自动备份脚本和恢复
- LeetCode- 169. Majority Element - 思路详解 -C++
- Windows2008 R2服务器配置TLS1.2方法
- C++字符串和基本类型转换的各种方法总结
- 2017.1.13【初中部 】普及组模拟赛C组 money 最小花费 题解
- 基于CTP的国内期货程序化交易之行情获取讲解
- 通过java连接mysql数据库
- 2017.1.12【初中部 GDKOI】模拟赛B组
- Java项目中读取properties文件
- 1021. Deepest Root
- 80老翁谈人生(346):方正不“正“,打击报复火星人有“方“
- Copyright中的年份是什么意思