九天雁翎的博客
如果你想在软件业获得成功,就使用你知道的最强大的语言,用它解决你知道的最难的问题,并且等待竞争对手的经理做出自甘平庸的选择。 -- Paul Graham

一天一个C Run-Time Library 函数 (10) atol,atof,atoi, ltoa , itoa,

 

一天一个C Run-Time Library 函数 (10) atol,atof,atoi, ltoa , itoa,

 

write by 九天雁翎(JTianLing) -- www.jtianling.com

 

msdn:

Convert strings to double (atof), integer (atoi,
_atoi64), or long (atol).

double
atof(

   
const char *
string

);

 

int
atoi(

   const
char *
string

);

 

_int64
_atoi64(

const
char *
string

);

 

long
atol(

const
char *
string

);

Converts a long
integer to a string. These functions are deprecated because more secure
versions are available; see
_ltoa_s, _ltow_s.

char *_ltoa(

   long value,

   char *str,

   int radix

);

wchar_t *_ltow(

   long value,

   wchar_t *str,

   int radix

);

template <size_t size>

char *_ltoa(

   long value,

   char (&str)[size],

   int radix

); // C++ only

template <size_t size>

wchar_t *_ltow(

   long value,

   wchar_t
(&
str)[size],

   int radix

); // C++ only

Converts a
long integer to a string. These functions are deprecated because more secure
versions are available; see
_ltoa_s, _ltow_s.

char *_ltoa(

   long value,

   char *str,

   int radix

);

wchar_t *_ltow(

   long value,

   wchar_t *str,

   int radix

);

template <size_t
size>

char *_ltoa(

   long value,

   char (&str)[size],

   int radix

); // C++ only

template <size_t
size>

wchar_t *_ltow(

   long value,

   wchar_t (&str)[size],

   int radix

); // C++ only

 

 

测试程序:

原谅我再偷懒一次

说明:

这一族函数的使用就看个人的习惯而异了,我个人使用的不是太多,除了一些不可避免的情况以外。

一般来说,sprintf可以完成大多数从整数到字符串的转换,转换很多的时候stringstream也是我常用并且更喜欢用的。从字符串到整数的方法好像就只能靠这些函数了。

记得就前两天看公司的代码,以前有个兄弟特别喜欢用这些函数,连对话框的中各类空间的获取一律都是先获取字符串,然后转换成整数。。。。。可能是不知道有类似GetDlgItemInt之类的接口吧。。。。

实现:

MS:

浮点数我没有找到源码。

整数的都通过一个更复杂的函数

static unsigned long __cdecl strtoxl (

        _locale_t
plocinfo,

        const char *nptr,

        const char **endptr,

        int ibase,

        int flags

        )

来实现。随便看了一眼,就像我个人想实现的话会用的方法一样,从字符串到整数,我应该会通过一个一个字符的计算与’0’字符的ascII值的差,然后相应其位置的乘以10^n,累加到一个整数吧。

整数到字符串可能就是上面方式的反过来。。。。假如不让用sprintf等函数时。(这个我没有看源码了,应该差不多)

 

gcc:

随便看了一下,也差不多

 

效率测试:

 

相关函数:

windows中有一些例如itow等,gcc由于支持C99C99中的long long类型也有支持,lltoa等。

个人想法:

想起一个大牛Lippman说过的话,假如C++抛弃了C那么多的整数类型的话,那么重载函数的负担会小得多。。。。。。。。事实就是这样。

这类函数就是典型的例子。不仅仅是重载麻烦了,并且哪怕一个简单的关于整数的函数,都需要实现很多种,并且在C中需要很多的名字。。。。还好有一定规律。

windows中甚至实现了关于double的此类函数,呵呵,浮点都有两种。

但是,反过来说,当在C++中还有那么多人需要精确的控制自己需要的整数大小,甚至有的时候根本就不是整数,需要的仅仅是一个确定大小的缓存(或空间)时,不同的整数就不可避免。。。。。其实,除非C++将所有的整数全部整合到integer然后将目前用于内存等精细操作的整形放在诸如BYTEWORD,DWORD中去实现也是不错的选择。。。。当然,很多时候,我们还是需要苛刻的对空间进行要求,对于一个表示类型的变量用unsigned char,对于一个不会大于65535的整数用unsigned short时,(我们公司写游戏和服务器的时候都是这样),这些想法可能永远不会实现。

记得,以前看到mysql的一份文档中,mysql的开发人员甚至以自己的整数类型比较多而感到自豪(也许不是自豪吧),进行了类似这样描述,mysql有丰富的整数类型,这样你可以使用更适合你的整数,在数据很大时,这可以为你省下很大的空间。。。。。。。。。。。the same in C/C++.......................

write by 九天雁翎(JTianLing) -- www.jtianling.com

 

分类:  C++ 
标签:  atof  atoi  atol  itoa  ltoa 

Posted By 九天雁翎 at 九天雁翎的博客 on 2008年11月13日

前一篇: 人类是在偷懒中进步的,用一个windows批处理解决4个脚本到html的转换+更多 后一篇: 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(2) IntCell类