VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 806|回复: 1

[原创] C++中的 atoi 和 itoa

[复制链接]
51_avatar_middle
online_admins Syc 发表于 2017-12-13 17:03:29 | 显示全部楼层 |阅读模式
由于本人当初也是从C语言转到C++阵营的,所以在写代码的过程中难免会用到C语言的东西,在公司当前的项目中用到了很多C++的标准模板库STL里面的东西,字符串类型的 string 自然少不了。于是在程序中就会涉及到很多关于字符串转到整型 和 整型转换成字符串 类型这样的转换。
也就是:
string => int
int => string

相信大家平时也经常遇到,之前呢,因为从C语言阵营转过来的,所以对于 string => int 一直用的是 atoi,int => string 一直用的是 itoa 或者 sprintf,示例代码如下:
  1. //string => int
  2. string str = "123";
  3. int num = atoi(str.c_str());
复制代码

  1. //int => string
  2. int num = 123;
  3. char szNum[100] = {0};
  4. sprintf(szNum, "%d", num);
  5. string str = szNum;
复制代码


之前一直这么用也没感觉什么,可近期总感觉既然是用C++的string,那么是否STL中应该有类似 atoi 或者 itoa 之类的函数实现呢?使用起来会更方便也更安全,不然一旦 szNum 这个缓冲区定义小了,就会发生溢出的现象。

不出所料,果然,在 C++ STL 的标准模板库 string 文件中找到了相关的函数实现,原来一直有,只是我没用到而已。
我本地安装的是vs2013,路径在:C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\string

关于整型或者浮点型转换到 string 字符串的重载函数就有9种,怎么样,很全吧,这回够用了,列出来给大家:
  1. string to_string(int _Val);
  2. string to_string(unsigned int _Val);
  3. string to_string(long _Val);
  4. string to_string(unsigned long _Val);
  5. string to_string(_Longlong _Val);
  6. string to_string(_ULonglong _Val);
  7. string to_string(long double _Val);
  8. string to_string(double _Val);
  9. string to_string(float _Val)
复制代码


怎么样,包含了我们常见的所有类型了。不过这些函数都是在 std 命名空间下面的,所以如果大家没有使用:using namespace std; 的话就得加上 std:: 前缀来引用上面那些函数喽!

好了,关于如何转换到 string 字符串类型就说到这,接下来说说如何将string字符串类型转换到 整型 或者 浮点型。C++ STL 也提供给我们 8 个函数来使用,声明如下:
  1. int stoi(const string& _Str, size_t *_Idx = 0, int _Base = 10);
  2. long stol(const string& _Str, size_t *_Idx = 0, int _Base = 10);
  3. unsigned long stoul(const string& _Str, size_t *_Idx = 0, int _Base = 10);
  4. _Longlong stoll(const string& _Str, size_t *_Idx = 0, int _Base = 10);
  5. _ULonglong stoull(const string& _Str, size_t *_Idx = 0, int _Base = 10);
  6. float stof(const string& _Str, size_t *_Idx = 0);
  7. double stod(const string& _Str, size_t *_Idx = 0);
  8. long double stold(const string& _Str, size_t *_Idx = 0);
复制代码


怎么样?也很全了吧,我们常见的 int、long、float、double 都有了,而且包含了有符号和无符号的版本。大家直接拿过来用就行了,而且第二个参数和第三个参数都有默认的实参,所以一般情况下大家只需要传递第一个的字符串类型参数就可以了。使用起来很方便的。同样这些函数也都是在 std 命名空间下!


还有一个方便大家的,这个文件中针对以上所有的函数都提供了一个宽字节的字符串的版本,即,字符串类型是 wstring,更方便大家来使用了!

好了,今天先说到这里了,以后有更好的东西再分享给大家!




上一篇:STL中各容器的erase()方法遍历删除元素
下一篇:分享一个boost视频

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-12-11 05:04

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表