数与字符串相互转化

字符串转化成数

stoi, stol, 和 stoll 都是C++标准库中的函数,用于将字符串转换为整数类型。它们的主要区别在于转换后得到的整数类型不同,以及适用的场景也因此有所差异。

1. stoi (string to integer)

  • 功能 :将字符串转换为 int 类型的整数。
  • 原型int stoi(const std::string& str, size_t* pos = nullptr, int base = 10);
  • 适用场景 :当你确定字符串表示的整数范围在 int 类型的范围内时使用。

示例

cpp 复制代码
std::string strNum = "123";
int num = std::stoi(strNum);

2. stol (string to long)

  • 功能 :将字符串转换为 long 类型的整数。
  • 原型long stol(const std::string& str, size_t* pos = nullptr, int base = 10);
  • 适用场景 :当需要更大的整数范围,且确定字符串表示的整数不超过 long 类型范围时使用
cpp 复制代码
std::string strLong = "1234567890";
long longNum = std::stol(strLong);

3. stoll (string to long long)

  • 功能 :将字符串转换为 long long 类型的整数。
  • 原型long long stoll(const std::string& str, size_t* pos = nullptr, int base = 10);
  • 适用场景 :适合转换非常大的整数,当字符串可能表示的整数超过 intlong 类型的最大值时使用。

示例

cpp 复制代码
std::string strBigNum = "1234567890123456789";
long long bigNum = std::stoll(strBigNum);

相似函数运用

除了上述三个函数,还有其他几个相似的函数用于不同类型的转换:

  • stoul (string to unsigned long):将字符串转换为无符号长整型。
  • stoull (string to unsigned long long):将字符串转换为无符号长整型的长整型。
  • stof (string to float):将字符串转换为浮点数。
  • stod (string to double):将字符串转换为双精度浮点数。
  • stold (string to long double):将字符串转换为长双精度浮点数。

转换的目标数据类型不同,以及需要根据实际情况选择合适的转换函数以确保数据的精确性和安全性 。使用时还需要注意错误处理,例如检查转换是否成功以及是否溢出等问题

数转换成字符串

1. 使用std::to_string函数

C++11引入了to_string函数,这是一个简单直接的方法来将基本数据类型转换为字符串。

  • 整数std::to_string(int val)
  • 浮点数std::to_string(double val)
  • 无符号整数std::to_string(unsigned int val)

示例:

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;
int main() {
    int num = 123;
    double pi = 3.14;
    cout << "Integer to string: " << to_string(num) << endl;
    cout << "Double to string: " << to_string(pi) << endl;
    return 0;
}

2. 使用std::stringstream

std::stringstream是一个更通用的工具,可以将多种类型的数据转换为字符串,也可以从字符串中读取数据。

示例:

cpp 复制代码
#include <iostream>
#include <sstream>
#include <string>
int main() {
    int num = 456;
    std::stringstream ss;
    ss << num; // 将整数转换为字符串
    std::string strNum = ss.str();
    std::cout << "Using stringstream: " << strNum << std::endl;
    return 0;
}

3. 使用sprintfsnprintf

这些是C语言中的函数,但在C++中也可以使用,尤其适合于需要更多控制或与C库交互的情况。

示例:

cpp 复制代码
#include <cstdio>
#include <iostream>
#include <string>
int main() {
    int value = 789;
    char buffer[32]; // 确保足够大以容纳转换后的字符串和终止符
    std::sprintf(buffer, "%d", value); // 将整数转换为字符串
    std::string strBuffer(buffer);
    std::cout << "Using sprintf: " << strBuffer << std::endl;
    return 0;
}

注意事项

  • 使用std::to_string是最简洁的方式,适用于大多数基本类型,但不支持自定义类型。
  • std::stringstream更为灵活,支持多种类型,还可以进行格式化输出。
  • sprintfsnprintf提供更多控制,但需要注意缓冲区大小以避免溢出,并且它们不是类型安全的。

取决于性能、代码简洁性或灵活性等

相关推荐
_殊途1 小时前
《Java HashMap底层原理全解析(源码+性能+面试)》
java·数据结构·算法
还债大湿兄1 小时前
《C++内存泄漏8大战场:Qt/MFC实战详解 + 面试高频陷阱破解》
c++·qt·mfc
倔强青铜33 小时前
苦练Python第18天:Python异常处理锦囊
开发语言·python
u_topian4 小时前
【个人笔记】Qt使用的一些易错问题
开发语言·笔记·qt
珊瑚里的鱼4 小时前
LeetCode 692题解 | 前K个高频单词
开发语言·c++·算法·leetcode·职场和发展·学习方法
AI+程序员在路上4 小时前
QTextCodec的功能及其在Qt5及Qt6中的演变
开发语言·c++·qt
xingshanchang4 小时前
Matlab的命令行窗口内容的记录-利用diary记录日志/保存命令窗口输出
开发语言·matlab
Risehuxyc4 小时前
C++卸载了会影响电脑正常使用吗?解析C++运行库的作用与卸载后果
开发语言·c++
AI视觉网奇5 小时前
git 访问 github
运维·开发语言·docker
不知道叫什么呀5 小时前
【C】vector和array的区别
java·c语言·开发语言·aigc