文章目录
下面会介绍两种字符串和数值相互转换方法:stringstream和函数
一、使用stringstream(简单粗暴)
C++中有ostringstream、istringstream、stringstream这三个类,要使用他们创建对象就必须包含sstream头文件
下面是这几个类的继承关系图:
1.stringstream
#include <iostream>
#include<sstream>
using namespace std;
int main()
{
int i = 1;
float f = 1.2;
double d = 1.23;
//number => string
stringstream ss1;
ss1 << i << " " << f << " " << d << endl;
string result = ss1.str();
cout <<"result = "<< result;// result = 1 1.2 1.23
//string=》number
string str = "123.5";
stringstream ss2(str);
ss2 >> i >> f;//转换符合数值格式 比如123a4.5b i = 123 f还是原来的
cout << "i = " << i << "\n f = " << f << endl;//i = 123 f = 0.5
system("pause");
return 0;
}
2.istringstream和ostringstream
#include <iostream>
#include<sstream>
using namespace std;
int main()
{
int i = 1;
float f = 1.2;
double d = 1.23;
//
ostringstream oss;
oss << i << " " << f << " " << d << endl;
string result = oss.str();
cout <<"result = "<< result;// result = 1 1.2 1.23
//number => string
string str = "123.5";
istringstream iss(str);
iss >> i >> f;
cout << "i = " << i << "\n f = " << f << endl;//i = 123 f = 0.5
system("pause");
return 0;
}
二 使用函数
1 字符串转成数值
#include<string>头文件中:
函数原型 | 说明 |
---|---|
int stoi(const string& _Str, size_t *_Idx = 0,int _Base = 10) | 把字符串_Str从_Idx 开始转换成_Base 进制的int |
long stol(const string& _Str, size_t *_Idx = 0,int _Base = 10) | 把字符串_Str从_Idx 开始转换成_Base 进制的long |
unsigned long stoul(const string& _Str, size_t *_Idx = 0,int _Base = 10) | 把字符串_Str从_Idx 开始转换成_Base 进制的unsigned long |
long long stoll(const string& _Str, size_t *_Idx = 0, int _Base = 10) | 把字符串_Str从_Idx 开始转换成_Base 进制的long long |
unsigned long long stoull(const string& _Str, size_t *_Idx = 0,int _Base = 10) | 把字符串_Str从_Idx 开始转换成_Base 进制的unsigned long long |
float stof(const string& _Str, size_t *_Idx = 0) | 把字符串_Str从_Idx 开始转换成float |
double stod(const string& _Str, size_t *_Idx = 0) | 把字符串_Str从_Idx 开始转换成double |
long double stold(const string& _Str, size_t *_Idx = 0) | 把字符串_Str从_Idx 开始转换成long double |
这些函数都是内联函数(inline)。
- 这些函数会抛出异常:argument out of range、invalid argument
#include <iostream>
#include<string>
using namespace std;
int main()
{
string str = "123.345";
int i = stoi(str);
float f = stof(str);
double d = stod(str);
cout << "i = " << i << "\nf = " << f <<"\nd = "<<d<< endl;
system("pause");
return 0;
}
3.char数组转换成数值
#include<stdlib.h>头文件中:
函数原型 | 说明 |
---|---|
double atof (char const* _String) | 将字符串_String转换为双精度浮点型值。 |
int atoi (char const* _String) | 将字符串_String转换为整型值。 |
long atol (char const* _String) | 将字符串_String转换为长整型值。 |
long long atoll (char const* _String) | 将字符串_String转换为long long值。 |
float strtof (const char* str, char** endptr); | 将字符串str转换为单精度浮点型值,到endptr停止 |
double strtod(const char * str,char ** endptr) | 将字符串str转换为双精度浮点型值,到endptr停止。 |
long int strtol (const char* str, char** endptr, int base) | 将字符串str转换为base进制长整值,到endptr停止。 |
long double strtold (const char* str, char** endptr) | 将字符串_String转换为长双精度浮点型值,到endptr停止。 |
long long int strtoll (const char* str, char** endptr, int base) | 将字符串str转换为base进制长长整值,到endptr停止。 |
unsigned long int strtoul (const char* str, char** endptr, int base) | 将字符串str转换为base进制无符号长整值,到endptr停止。 |
unsigned long long int strtoull (const char* str, char** endptr, int base) | 将字符串str转换为base进制无符号长长整值,到endptr停止。 |
- endptr 为NULL时,无法获取停止后的下一个字符
- base如果为0时,将会按照字符串中的格式来转换
#include <iostream>
using namespace std;
int main()
{
char str[]= "123.34 5.12";
char* dptr;
int i = atoi(str);
float f = atof(str);
double d = strtod(str,&dptr);
double dd = strtod(dptr, NULL);
cout << "i = " << i << "\nf = " << f <<"\nd = "<<d<<"\ndd = "<<dd <<endl;
system("pause");
return 0;
}
//输出:
i = 123
f = 123.34
d = 123.34
dd = 5.12
//关于base的举例
#include <iostream>
using namespace std;
int main()
{
char szNumbers[] = "2001 60c0c0 -1101110100110100100000 0x6fffff";
char * pEnd;
long int li1, li2, li3, li4;
li1 = strtol(szNumbers, &pEnd, 10);
li2 = strtol(pEnd, &pEnd, 16);
li3 = strtol(pEnd, &pEnd, 2);
li4 = strtol(pEnd, NULL, 0);
printf("The decimal equivalents are: %ld, %ld, %ld and %ld.\n", li1, li2, li3, li4);
system("pause");
return 0;
}
//输出 60c0c0(16) = 6340800(10) -1101110100110100100000(2) = -3624224(10) 0x6fffff(0自己识别) = 7340031 (10)
The decimal equivalents are: 2001, 6340800, -3624224 and 7340031
3.数值转换为字符串
#include<string>头文件中:inline string to_string(val);
具体如下:
string to_string (int val);
string to_string (long val);
string to_string (long long val);
string to_string (unsigned val);
string to_string (unsigned long val);
string to_string (unsigned long long val);
string to_string (float val);
string to_string (double val);
string to_string (long double val);
#include <iostream>
#include<sstream>
using namespace std;
int main()
{
int i = 1;
float f = 1.2;
double d = 1.23;
cout<< to_string(i) << " " << to_string(f) << " " << to_string(d) << endl;// 1 1.200000 1.230000
system("pause");
return 0;
}
三 总结
终于写完了,以后遇到这方面的问题不用愁了。有想深入了解这些知识或者其他的函数,可以点击后面的参考,相信我,你一定会有意外的收获的。
来源:CSDN
作者:嗨,人
链接:https://blog.csdn.net/qq_33670157/article/details/104690110