首先提出解决方案:
- atoi(头文件
<stdlib.h>
):int atoi(const char *str)
该函数返回转换后的长整数,如果没有执行有效的转换,则返回零。
- strtol(头文件
<stdlib.h>
):long int strtol(const char *str, char **endptr, int base)
该函数返回转换后的长整数,如果没有执行有效的转换,则返回一个零值。- str – 要转换为长整数的字符串。
- endptr – 对类型为 char* 的对象的引用,其值由函数设置为 str 中数值后的下一个字符。(即把整数部分后面的字符串返回)
- base – 基数,必须介于 2 和 36(包含)之间,或者是特殊值 0。
- stoi(头文件
<string>
):int stoi (const string& str, size_t* idx = 0, int base = 10);
这几个有什么不同呢?下面测试对比。
C语言风格函数
atoi与strtol对比:
1 | string str = "16s"; |
输出:
1 | atoi的结果为:16 |
这两个函数都是从字符串开始寻找数字或者正负号或者小数点,遇到非法字符终止(即匹配第一个出现的连续的数字)。
所以到上述s字符就不输出了,提前结束,也就是说当你的字符串不是数字的时候,或者小数点等非数字,不会报异常!直接输出0。
例如:
1 | string str = "asdsa"; |
输出:
1 | 0 |
strtol相比与atoi来说,支持多种进制转换,例如8进制等
例如:
1 | int b = strtol(str.c_str(), nullptr, 8); |
C++风格
在C++中可以使用stoi来转int,这个函数相比于前两个一个最大特点是:异常!
我们知道C++相比于C语言多了异常,这也是这个函数在C++中具有的最显著功能。
例如:
1 | string str1 = "asq,"; |
异常如下:
1 | terminate called after throwing an instance of 'std::invalid_argument' |
- stoi()会检查输入是否越界,默认范围也是在int的范围内,越界后则会报错runtime error!
- atoi()没有安全性检查
如果我们输入的这个字符串转换成int超出了int范围[-2147483648, 2147483647],则会输出错误
如果结果超出了int的上界,则输出为上界的值2147483647
如果结果超出了下界,则输出为下界的值-2147483647
如果字符串无法转换为一个int或这个字符串为空,则会返回0。
自定义,更推荐这种方法
也就是自己写,如下:
1 | int stringToInt(const string &s) { |
这里介绍一下stringstream
<sstream>
定义了三个类:istringstream、ostringstream 和 stringstream,分别用来进行流的输入、输出和输入输出操作。
<sstream>
主要用来进行数据类型转换,由于 <sstream>
使用 string 对象来代替字符数组(snprintf 方式),避免了缓冲区溢出的危险;而且,因为传入参数和目标对象的类型会被自动推导出来,所以不存在错误的格式化符号的问题。简单说,相比 C 编程语言库的数据类型转换,<sstream>
更加安全、自动和直接。
1 | // int 转 string |