一、字符/字符串转整数
1. 使用 std::stoi
(C++11 及以上)
说明:标准库函数,支持异常处理,可指定进制。
适用场景:推荐用于字符串到整数的安全转换。
代码示例:
#include <string>
#include <iostream>
int main() {
std::string str = "-1234";
try {
size_t pos;
int num = std::stoi(str, &pos, 10); // 十进制
std::cout << "转换结果: " << num << std::endl;
if (pos < str.size()) {
std::cout << "注意:未解析的字符起始位置为 " << pos << std::endl;
}
} catch (const std::invalid_argument& e) {
std::cerr << "无效输入: " << e.what() << std::endl;
} catch (const std::out_of_range& e) {
std::cerr << "数值溢出: " << e.what() << std::endl;
}
return 0;
}
注意:stol
(转 long)、stoll
(转 long long)用法类似
2. 使用 std::stringstream
说明:流处理方式灵活,但性能较低。
适用场景:需要同时处理多种数据类型转换时。
代码示例:
#include <sstream>
#include <string>
int main() {
std::string str = "456";
std::stringstream ss(str);
int num;
if (ss >> num) {
std::cout << "转换结果: " << num << std::endl;
} else {
std::cerr << "转换失败" << std::endl;
}
return 0;
}
3. 使用 atoi
(C 标准库函数)
说明:简单但无错误处理,适用于已知合法的字符串。
适用场景:快速转换且无需处理异常。
代码示例:
#include <cstdlib>
#include <string>
int main() {
std::string str = "789";
int num = std::atoi(str.c_str());
std::cout << "转换结果: " << num << std::endl;
return 0;
}
缺点:若字符串含非数字字符,结果不可预测
4. 手动实现转换
说明:自行处理符号、溢出和非法字符。
适用场景:需要高度定制化逻辑。
代码示例:
#include <string>
#include <climits>
int stringToInt(const std::string& s) {
int num = 0, sign = 1, i = 0;
if (s.empty()) return 0;
// 处理符号
if (s[i] == '-' || s[i] == '+') {
sign = (s[i++] == '-') ? -1 : 1;
}
// 转换数字
for (; i < s.size(); ++i) {
if (s[i] < '0' || s[i] > '9') break; // 遇到非数字字符停止
int digit = s[i] - '0';
// 检查溢出
if (num > INT_MAX / 10 || (num == INT_MAX / 10 && digit > 7)) {
return (sign == 1) ? INT_MAX : INT_MIN;
}
num = num * 10 + digit;
}
return num * sign;
}
int main() {
std::string str = "-2147483648";
std::cout << "手动转换结果: " << stringToInt(str) << std::endl;
return 0;
}
注意:此代码参考了力扣题目解法
5. 使用 std::from_chars
(C++17)
说明:高性能且无异常,适合解析大文件。
适用场景:需要高效解析且支持错误码。
代码示例:
#include <charconv>
#include <string>
int main() {
std::string str = "12345";
int num;
auto result = std::from_chars(str.data(), str.data() + str.size(), num);
if (result.ec == std::errc()) {
std::cout << "转换结果: " << num << std::endl;
} else {
std::cerr << "转换失败" << std::endl;
}
return 0;
}
二、字符转整数
单个字符转整数
说明:直接利用 ASCII 差值。
代码示例:
char c = '7';
int num = c - '0'; // 结果为 7
注意:需确保字符为数字,否则结果错误
三、整数转字符串
1. 使用 std::to_string
(C++11 及以上)
说明:简单直接,支持所有整数类型。
代码示例:
#include <string>
int main() {
int num = -42;
std::string str = std::to_string(num);
std::cout << "字符串结果: " << str << std::endl; // 输出 "-42"
return 0;
}
2. 使用 std::stringstream
说明:支持多种类型混合转换。
代码示例:
#include <sstream>
#include <string>
int main() {
int num = 123;
std::stringstream ss;
ss << num;
std::string str = ss.str();
std::cout << "字符串结果: " << str << std::endl;
return 0;
}
3. 使用 sprintf
(C 标准库函数)
说明:需预分配缓冲区,适合性能敏感场景。
代码示例:
#include <cstdio>
#include <cstring>
int main() {
int num = 456;
char buffer[20];
sprintf(buffer, "%d", num);
std::string str(buffer);
std::cout << "字符串结果: " << str << std::endl;
return 0;
}
4. 手动实现转换
说明:处理负数和逆序问题。
代码示例:
#include <algorithm>
#include <string>
std::string intToString(int num) {
if (num == 0) return "0";
bool isNegative = num < 0;
std::string str;
num = isNegative ? -num : num;
while (num > 0) {
str.push_back(num % 10 + '0');
num /= 10;
}
if (isNegative) str.push_back('-');
std::reverse(str.begin(), str.end());
return str;
}
int main() {
std::cout << "手动转换结果: " << intToString(-123) << std::endl; // 输出 "-123"
return 0;
}
四、其他方法
-
Boost 库:
boost::lexical_cast
支持类型安全转换,需额外安装 -
Qt 库:
QString::number()
和QString::toInt()
,适用于 Qt