软考
APP下载

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类。该类定义在 头文件中,可以进行输入输出流的操作。通过cin和cout我们可以轻易的实现输入输出流,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 (str);

```

需要注意的是,在使用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 (end - start);

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 (end - start);

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 (end - start);

cout << "Time taken by stringstream: " << duration.count() << " microseconds" << endl;

start = high_resolution_clock::now();

num = boost::lexical_cast (str);

end = high_resolution_clock::now();

duration = duration_cast (end - start);

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等方法,并对其性能进行了比较。需要注意的是,不同的方法适用于不同的场景。在实际编程中,要根据具体的需求选择适合的方法。

备考资料 免费领取:软件设计师报考指南+考情分析+思维导图等 立即下载
真题演练 精准解析历年真题,助你高效备考! 立即做题
相关阅读
软件设计师题库