0%

将string类型转换为int类型

首先提出解决方案:

  • 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
2
3
string str = "16s";
int a = atoi(str.c_str());
int b = strtol(str.c_str(), nullptr, 10);

输出:

1
2
atoi的结果为:16
strtol的结果为:16

这两个函数都是从字符串开始寻找数字或者正负号或者小数点,遇到非法字符终止(即匹配第一个出现的连续的数字)。

所以到上述s字符就不输出了,提前结束,也就是说当你的字符串不是数字的时候,或者小数点等非数字,不会报异常!直接输出0

例如:

1
2
3
string str = "asdsa";
int a = atoi(str.c_str());
int b = strtol(str.c_str(), nullptr, 10);

输出:

1
2
0
0

strtol相比与atoi来说,支持多种进制转换,例如8进制等

例如:

1
int b = strtol(str.c_str(), nullptr, 8);

C++风格

在C++中可以使用stoi来转int,这个函数相比于前两个一个最大特点是:异常

我们知道C++相比于C语言多了异常,这也是这个函数在C++中具有的最显著功能。

例如:

1
2
3
4
5
string str1 = "asq,";
// int c = stoi(str1); // 报异常
string str2 = "12312";
int c = stoi(str2); // ok
cout << c << endl;

异常如下:

1
2
terminate called after throwing an instance of 'std::invalid_argument'
what(): stoi
  • stoi()会检查输入是否越界,默认范围也是在int的范围内,越界后则会报错runtime error!
  • atoi()没有安全性检查
    如果我们输入的这个字符串转换成int超出了int范围[-2147483648, 2147483647],则会输出错误
    如果结果超出了int的上界,则输出为上界的值2147483647
    如果结果超出了下界,则输出为下界的值-2147483647
    如果字符串无法转换为一个int或这个字符串为空,则会返回0。

自定义,更推荐这种方法

也就是自己写,如下:

1
2
3
4
5
6
7
8
9
10
11
int stringToInt(const string &s) {
int v;
stringstream ss;
ss << s;
ss >> v;
return v;
}
int main() {
int i = stringToInt("2.3");
cout<<i<<endl;
}

这里介绍一下stringstream

<sstream> 定义了三个istringstreamostringstreamstringstream,分别用来进行流的输入、输出和输入输出操作。

<sstream> 主要用来进行数据类型转换,由于 <sstream> 使用 string 对象来代替字符数组(snprintf 方式),避免了缓冲区溢出的危险;而且,因为传入参数和目标对象的类型会被自动推导出来,所以不存在错误的格式化符号的问题。简单说,相比 C 编程语言库的数据类型转换,<sstream> 更加安全、自动和直接。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// int 转 string
#include <string>
#include <sstream>
#include <iostream>
#include <stdio.h>

using namespace std;

int main()
{
stringstream sstream;
string strResult;
int nValue = 1000;

// 将int类型的值放入输入流中
sstream << nValue;
// 从sstream中抽取前面插入的int类型的值,赋给string类型
sstream >> strResult;

cout << "[cout]strResult is: " << strResult << endl;
printf("[printf]strResult is: %s\n", strResult.c_str());

return 0;
}

//转任意类型
template<typename out_type, typename in_value>
out_type convert(const in_value & t){
stringstream stream;
   stream<<t;//向流中传值
   out_type result;//这里存储转换结果
   stream>>result;//向result中写入值
   return result;
    }