跟我学C++中级篇——字符串的转化

一、字符串和普通类型的转化

在实际的开发中,可能大家都经常遇到一个问题,那就是把字符串转化成基础类型或者逆向行为。这种情况下,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::
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值