C++ 由string与int相互转换引发的一系列问题

1. 内置的转换函数

再记不住这些函数我就是狗

#include <iostream>
#include <string>
using namespace std;
int main() {
    int i_a = 12345, i_b = -23;
    /* 正负数也都不受影响 */
    int a;
    string s_a, s_b;
    s_a = to_string(i_a);
    cout << s_a << " " << sizeof(s_a) << endl;      //12345 32
    /* 为什么是32个字节? 因为sting是一种容器,它在内存中就先开辟了32个字节 */
    s_b = to_string(i_b);
    cout << s_b << " " << sizeof(s_b) << endl;      //-23 32

    a = stoi(s_a);
    cout << a << " " << sizeof(a) << endl;          //12345 4
    i_b = stoi(s_b);
    cout << i_b << " " << sizeof(i_b) << endl;      //-23 4 
}

2. 自己封装转换函数

2.1 string转int

  • 最基本的转换函数应该怎么写
  • 还需要考虑的因素
    1)传入的字符串为空
    2)符号位的处理
    3)错误字符的处理
#include <iostream>
#include <string>
using namespace std;

class Solution {
public:
    int str_to_int(const string str) {
        /* 传入的字符串为空 */
        if(str.compare("") == 0 || str.length() == 0) {
        /* 这两项都是可以判断字符串为空的标志 */
            cout << "empty string" << endl;
            return 0;
        }

        /* 符号位的处理 */
        bool negative = true;
        int pos = 0;
        if(str[0] == '-') {
            negative = false;
            pos++;
        } else if(str[0] == '+'){
            pos++;
        }
        /* 最基本的写法 */
        int number = 0;
        while (pos < str.length())
        {
            /* 错误字符的处理 */
            if(str[pos] <= '9' && str[pos] >= '0') {
                number *= 10;
                number += (str.at(pos) - '0');
                pos++;
            } else {
                cout << "invaild string" << endl;
                return 0;
            }
            
        }
        
        return negative ? number : -number;
    }
    // string int_to_str(const int number) {

    // }
};
int main() {
    Solution s;
    string str1 = "456";
    int num;
    num = s.str_to_int(str1);
    cout << num << endl;        //456
    s.str_to_int("");           //empty string

    string str2 = "+56", str3 = "-88";
    num = s.str_to_int(str2);
    cout << num << endl;        //56 
    num = s.str_to_int(str3);
    cout << num << endl;        //-88 

    string str4 = "adf12";
    s.str_to_int(str4);         //invaild string

}

2.2 int转string

(待补)

3. 数据范围

在string转int的过程中,还可能出现转换为int却超出了int的存储范围。针对数据范围的问题,由一个问题引出。

3.1 问题描述

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。

3.2 问题分析

  • 为什么是 [−231, 231 − 1]
    因为int类型是4个字节,最前面的一位是符号位。
  • 什么方法可以将数字反转
    %10可以将一个数字从低位开始取,而/(10*(位数-1))可以将一个数字从最高位取。
  • 新转换后的数字用什么类型存储
    231 − 1 = 2147483647,将这个数字反转后7463847412,明显int装不下,要用long。
  • 负数取余
    两个异号的数取余之后的结果取决于分子的符号。

3.3 实现

#include <iostream>
using namespace std;
class Solution {
public:
    int reverse(int x) {
        bool negative = true;
        if(x < 0) {
            negative = false;
            x = abs(x);
            /* 将负数转为正数 */
        }
        long n = 0;
        // cout << sizeof(long) << endl;   //8
        while(x) {
            n = n*10 + x%10;
            x /= 10;
        }
    
        return (int)n == n ? negative ? n : -n : 0;
        /* (int)n == n这个语句判断了n有没有超过int的范围,太秒了,打call*/
    }
};
int main() {
    int a = 10, b = 0, c = 120, d = -123;
    int result;
    Solution s;
    result = s.reverse(a);
    cout << result << endl;
    result = s.reverse(b);
    cout << result << endl;
    result = s.reverse(c);
    cout << result << endl;
    result = s.reverse(d);
    cout << result << endl;
}

4. 总结

  • 不能仅仅注意代码的功能,比如参数的正确性、参数的范围以及异常情况的处理等等。

参考链接

[1] String转int问题分析.

[2] 负数取余问题.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橙橙小狸猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值