C++中字符串与数值转换(超详细)

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-07 06:49:14


下面会介绍两种字符串和数值相互转换方法: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;
}

三 总结

    终于写完了,以后遇到这方面的问题不用愁了。有想深入了解这些知识或者其他的函数,可以点击后面的参考,相信我,你一定会有意外的收获的。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!