C++整数与字符(串)相互转换的方法

时间:2025-03-30 08:05:03
一、字符/字符串转整数

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