c++如何将字符串转换为数字_c++字符串与数字类型互转方法

c++如何将字符串转换为数字_c++字符串与数字类型互转方法
最新回答
瞳孔渲染柔情╮

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处理。

  • 示例:#include <string>#include <iostream>int main() { try { std::string str = "12345"; int num = std::stoi(str); double val = std::stod("3.14"); std::cout << num << ", " << val << std::endl; // 输出:12345, 3.14 } catch (const std::exception& e) { std::cerr << "转换失败: " << e.what() << std::endl; } return 0;}
2. 使用stringstream解析
  • 特点

    兼容性好,支持老版本编译器。

    适合复杂场景(如混合类型解析或格式控制)。

  • 示例:#include <sstream>#include <string>#include <iostream>int main() { std::string str = "6789"; int num; std::stringstream ss(str); ss >> num; // 字符串转数字 double val; std::stringstream ss2("3.14"); ss2 >> val; std::cout << num << ", " << val << std::endl; // 输出:6789, 3.14 return 0;}
二、数字转字符串1. 使用std::to_string()(C++11起支持)
  • 特点

    直接调用,代码简洁。

    浮点数可能包含尾随零(如3.140000)。

  • 示例:#include <string>#include <iostream>int main() { int num = 42; std::string str = std::to_string(num); // "42" double pi = 3.14159; std::string pi_str = std::to_string(pi); // "3.141590" std::cout << str << ", " << pi_str << std::endl; return 0;}
2. 使用ostringstream格式化输出
  • 特点

    灵活控制格式(如精度、进制)。

    适合需要定制输出的场景。

  • 示例:#include <sstream>#include <iostream>int main() { // 控制浮点数精度 std::ostringstream oss; oss.precision(2); // 设置小数点后2位 oss << 123.456; std::string str = oss.str(); // "123.46" // 输出十六进制整数 std::ostringstream oss2; oss2 << std::hex << 255; std::string hex_str = oss2.str(); // "ff" std::cout << str << ", " << hex_str << std::endl; return 0;}
三、关键注意事项
  1. 异常处理

    标准库函数(如std::stoi)可能抛出std::invalid_argument(非法字符)或std::out_of_range(数值超出范围),务必用try-catch捕获。

    stringstream解析失败时,需检查流状态(如ss.fail())。

  2. 浮点精度

    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;}

  3. 性能考量

    简单场景优先用std::stoi/std::to_string,代码简洁且编译器优化良好。

    复杂格式或兼容性需求选stringstream。

四、总结
  • 字符串转数字

    现代C++:std::stoi/std::stod(需异常处理)。

    通用方案:stringstream。

  • 数字转字符串

    快速转换:std::to_string()。

    格式控制:ostringstream。

根据项目需求和编译环境选择合适方法,兼顾安全性与可维护性。