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] 负数取余问题.