2020-07-25 13:00:45
在C++中,字符串与数字类型的互转可通过标准库函数或stringstream实现,需注意异常处理和浮点精度控制。以下是具体方法及示例:
一、字符串转数字1. 使用标准库函数(C++11起支持)std::stoi():字符串转int
std::stol():字符串转long
std::stoll():字符串转long long
std::stof():字符串转float
std::stod():字符串转double
简洁高效,直接返回目标类型。
遇到非法字符会抛出异常(如std::invalid_argument或std::out_of_range),需用try-catch处理。
兼容性好,支持老版本编译器。
适合复杂场景(如混合类型解析或格式控制)。
直接调用,代码简洁。
浮点数可能包含尾随零(如3.140000)。
灵活控制格式(如精度、进制)。
适合需要定制输出的场景。
异常处理:
标准库函数(如std::stoi)可能抛出std::invalid_argument(非法字符)或std::out_of_range(数值超出范围),务必用try-catch捕获。
stringstream解析失败时,需检查流状态(如ss.fail())。
浮点精度:
std::to_string()生成的浮点字符串可能包含冗余零,需手动截断或使用ostringstream控制精度。
示例:截断尾随零#include <string>#include <algorithm>std::string trim_trailing_zeros(const std::string& s) { size_t end = s.find_last_not_of('0'); if (end == std::string::npos) return "0"; if (s[end] == '.') end++; // 保留小数点 return s.substr(0, end + 1);}int main() { std::string s = std::to_string(3.140000); std::cout << trim_trailing_zeros(s); // 输出 "3.14" return 0;}
性能考量:
简单场景优先用std::stoi/std::to_string,代码简洁且编译器优化良好。
复杂格式或兼容性需求选stringstream。
现代C++:std::stoi/std::stod(需异常处理)。
通用方案:stringstream。
快速转换:std::to_string()。
格式控制:ostringstream。
根据项目需求和编译环境选择合适方法,兼顾安全性与可维护性。