前言
本文围绕“字符串 string类型 与 int,double等类型的转换”详细的阐述其转换的细节。
要点:
· c_str() string的成员函数,将string转换为const char* 类型数据
· atoi(),atof() 将char* 数据转换为int,double类型
· to_string() 将int,double转换为string类型
to_string(), atoi()... 均在头文件stdlib.h下
目录
1. 示例
直接上示例,结合后面的分析,对照示例。int类型的转换较简单,但浮点数double的转换需要注意。
#include <iostream>
#include <string>
#include "stdlib.h"
using namespace std;
int main() {
string str = "-2222";
char chs[10] = "3333";
int x1 = atoi(str.c_str());
int x2 = atoi(chs);
double d = atof("23.122221121");
double f = 223.2121231231;
double t = 2123123.12;
string s1 = to_string(d);
string s2 = to_string(f);
string s3 = to_string(t);
string s4 = to_string(23232323);
cout<< "string -> int: " << x1 << " " << x2 << endl;
cout<< "string -> double: " << d << " " << f << endl;
cout<< "double -> string: " << s1 << " " << s2 << " " << s3 << endl;
cout<< "int -> string: " << s4 << endl;
printf("print double: %f %f %f\n", d, f, t);
printf("%.12f %.8f\n", d, t);
return 0;
}
输出:
可见cout输出浮点数d,f数据不完全,这是由于cout输出浮点数格式的默认设置,这个是可以改的。而最后一行printf输出说明数据d是正确的。
这时发现第三行输出 “ string s1 = to_string(d); ”数据小数位不完整,却与第五行printf double数据一样,注意这点,后面会解释。
2. 字符串转int,double...
2.1 c_str()
string的成员函数,其返回值为const char* 不能用于初始化char* 类型。
2.2 atoi(),atof()...
将char* 数据类型转换为int,double...类型
直接上源码,很显然也无需多说明吧。
// stdlib.h
//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//
// Narrow String to Number Conversions
//
//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
_Check_return_ _ACRTIMP double __cdecl atof (_In_z_ char const* _String);
_Check_return_ _CRT_JIT_INTRINSIC _ACRTIMP int __cdecl atoi (_In_z_ char const* _String);
_Check_return_ _ACRTIMP long __cdecl atol (_In_z_ char const* _String);
_Check_return_ _ACRTIMP long long __cdecl atoll (_In_z_ char const* _String);
_Check_return_ _ACRTIMP __int64 __cdecl _atoi64(_In_z_ char const* _String);
示例:
string str = "-2222";
char chs[10] = "3333";
int x1 = atoi(str.c_str());
int x2 = atoi(chs);
double d = atof("23.122221121");
3. int, double...转string
上源码:
// stdlib.h
_NODISCARD inline string to_string(int _Val) { // convert int to string
return _Integral_to_string<char>(_Val);
}
_NODISCARD inline string to_string(double _Val) { // convert double to string
const auto _Len = static_cast<size_t>(_CSTD _scprintf("%f", _Val));
string _Str(_Len, '\0');
_CSTD sprintf_s(&_Str[0], _Len + 1, "%f", _Val);
return _Str;
}
// 还有参数为unsigned int, long, long long, float等的重载,就不都列出来了
整数转string直接to_string(int )即可
3.1 double转string问题
double转string后小数位不正确问题,见源码,浮点数输入to_string(double)进行了转 “%f” 格式,其输出也类似于
double d = atof("23.122221121");
double f = 223.2121231231;
double t = 2123123.12;
printf("print double: %f %f %f\n", d, f, t);
printf输出浮点数,除“%.12f %.8f”设置输出位数外,默认保留小数点后6位输出。
这也是为何 "double -> string: " 与 "printf double: " 输出一致。