一、字符串和普通类型的转化
在实际的开发中,可能大家都经常遇到一个问题,那就是把字符串转化成基础类型或者逆向行为。这种情况下,C/C++的相对于其它语言的劣势一览无余。要么,看上去转化方式比较简单,但适应性低,对异常处理的不好;要么,使用复杂,不容易掌握。
同时,在c++中还存在着大量的不同平台定义的不同的字符串类型,特别是一些Unicode字符串的定义,在早期更是五花八门。本文重点是分析介绍标准库的std:string与其它基础类型的转化,Unicode相关字符串的转化以后再分析。
二、基础类型转字符串方法
1、基础的入门方法
这个比较常见的是C库函数提供的几个转换函数:
itoa():将整型值转换为字符串
ltoa():将长整型值转换为字符串
ultoa():将无符号长整型值转换为字符串
gcvt():将浮点型数转换为字符串,取四舍五入
ecvt():将双精度浮点型值转换为字符串,转换结果中不包含十进制小数点
fcvt():指定位数为转换精度,其余同ecvt()
在c++11后,STD提供了一个std::to_string(val)的方法。需要注意,itoa函数并不是标准C函数,如果需要跨平台时,需要自己处理相关的事项。
看下面的小例子:
#include <iostream>
#include <charconv>
#include <stdlib.h>
#include <string>
//#include <strstream> //c++17前
#include <sstream> //c++17
#include <bitset>
#include <stdio.h>
void baseTostr()
{
std::cout << "基础类型转字符串..." << std::endl;
int num = 123;
double db = 1.233;
int dec;
int sign;
char buf[10] = {
0};
_itoa_s(num, buf, 4,10);//vc
std::string sn(buf);
std::cout << "num to str is:"<<sn << std::endl;
errno_t err = _ecvt_s(buf,10,db,4,&dec,&sign);
std::cout << "double db to str is:" << buf << std::endl;
err = _gcvt_s(buf,10,db,4);
std::cout << "double db to str is:" << buf << std::endl;
auto sd = std::to_string(num);
auto sd1 = std::to_string(db);
std::cout << "num is:" << sd << ",db is:" << sd1 << std::endl;
std::string str = std::bitset<32>(num).to_string();
std::cout << "bitset string is:" << str << std::endl;
}
其实在C库和C++中还有一些库可能没有顾及到,大家查找类似的即可。此处的例子是在VS2022运行的,所以都针对微软的要求进行了修改,如果使用Posix,则改回标准C库的用法即可。
2、char*(char[])基础类型转字符串
这种就相对简单一些,可以直接使用string的构造函数或赋值构造函数:
void charsTostr()
{
std::cout << "char* or char[]转字符串..." << std::endl;
const char* p = "this is test!";
char buf[] = "my test!";
std::