c++字符串转化为数字
在C++编程中,将字符串转化为数字是一个经常用到的操作,比如从用户输入的字符串中获取数字等。本文将从多个角度分析如何实现这一操作。
一. 使用C++11的std::stoi函数
C++11引入了一个新的函数std::stoi,可以将字符串转化为整数。该函数的原型如下:
```
int stoi(const std::string& str, std::size_t* pos = 0, int base = 10);
```
其中str是需要转化的字符串,pos是一个指针,用于返回转化结束位置的下标,base是进制数,默认为10。例如:
```
std::string str = "1234";
int num = std::stoi(str);
```
使用std::stoi函数的好处是简单、方便,且有错误检查机制,当转化失败时会抛出std::invalid_argument异常。
二. atoi函数
除了使用 std::stoi函数,C++中还有一个常用的函数可以将字符串转化为数字,那就是atoi函数。其原型为:
```
int atoi(const char* str);
```
该函数接受一个const char*类型的参数,返回一个整数。具体用法如下:
```
const char* str = "1234";
int num = atoi(str);
```
需要注意的是,如果传入的参数不是一个合法的数值字符串,返回值会是0。因此,使用该函数的时候需要保证传入的参数合法。
三. stringstream
C++中还有另外一种将字符串转化为数字的方法——stringstream类。该类定义在
```
std::string str = "1234";
int num;
std::stringstream stream(str);
stream >> num;
```
通过定义一个stringstream对象,将字符串传入该对象,再使用流操作符“>>”将字符串转化为数字。值得注意的是,在使用stringstream时需要注意错误处理,因为如果字符串不是一个合法数值,将会导致程序异常终止。
四. boost库的lexical_cast
除了C++标准库内的方法,还有其他许多开源库,这里我们介绍boost库的lexical_cast。该函数具有一定的通用性,可以将各种类型的数据转化为字符串或将字符串转化为各种类型的数据。其原型如下:
```
template
inline Target lexical_cast(const Source& arg);
```
其中Target表示目标类型,Source表示源类型。在把字符串转化为数字时,Target为int或long等,Source为string。具体用法如下:
```
std::string str = "1234";
int num = boost::lexical_cast
```
需要注意的是,在使用lexical_cast时必须保证转化是可行的,否则会抛出boost::bad_lexical_cast异常。
五. 性能比较
不同的字符串转化为数字方法,其性能有所不同。我们可以编写一个简单的程序,比较各种方法在时间和空间上的消耗。下面是一个简单的程序:
```
#include
#include
#include
#include
#include
#include
using namespace std;
using namespace std::chrono;
int main()
{
string str = "123456789";
auto start = high_resolution_clock::now();
int num;
num = atoi(str.c_str());
auto end = high_resolution_clock::now();
auto duration = duration_cast
cout << "Time taken by atoi: " << duration.count() << " microseconds" << endl;
start = high_resolution_clock::now();
num = std::stoi(str);
end = high_resolution_clock::now();
duration = duration_cast
cout << "Time taken by std::stoi: " << duration.count() << " microseconds" << endl;
start = high_resolution_clock::now();
stringstream stream(str);
stream >> num;
end = high_resolution_clock::now();
duration = duration_cast
cout << "Time taken by stringstream: " << duration.count() << " microseconds" << endl;
start = high_resolution_clock::now();
num = boost::lexical_cast
end = high_resolution_clock::now();
duration = duration_cast
cout << "Time taken by boost::lexical_cast: " << duration.count() << " microseconds" << endl;
return 0;
}
```
对不同的字符串进行转化,得到的时间如下:
|方法|运行时间(微秒)|
|----|----|
|atoi|11|
|std::stoi|8|
|stringstream|20|
|boost::lexical_cast|28|
可以看到,std::stoi函数的性能是最好的,而boost::lexical_cast的性能相对较差。
六. 总结
本文从常用的多个角度阐述了C++如何将字符串转化为数字,包括C++11的std::stoi、atoi函数、stringstream、boost库的lexical_cast等方法,并对其性能进行了比较。需要注意的是,不同的方法适用于不同的场景。在实际编程中,要根据具体的需求选择适合的方法。