itoa函数是怎么编写的?

h_5_hao 2009-01-05 12:51:18
我在msdn上看见itoa这个函数 我想知道这个函数是怎么编写的 ~
...全文
360 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
waizqfor 2009-01-05
  • 打赏
  • 举报
回复
转一个高效方法

char *myitoa( int value, char *str, int radix )
{
static char szMap[] = {
'0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'a', 'b',
'c', 'd', 'e', 'f', 'g', 'h',
'i', 'j', 'k', 'l', 'm', 'n',
'o', 'p', 'q', 'r', 's', 't',
'u', 'v', 'w', 'x', 'y', 'z'
}; // 字符映射表
int nCount = -1, nIndex;
char *pStr = str, nTemp;
if ( radix >= 2 && radix <= 36 )
{ // 限制radix必须在2到36之间
if ( value < 0 && radix == 10 )
{ // 如果是负数就在首位添加负号,并将字符串前移
*pStr++ = '-';
value = -value; //转为正数,
}
unsigned int nValue = *(unsigned*)&value;
do { // 循环转换每一个数字,直到结束
pStr[ ++nCount ] = szMap[ nValue % radix ];
nValue /= radix;
} while( nValue > 0 ); // 转换结束后字符串是翻的
nIndex = ( nCount + 1 ) / 2; // 计算出一半的长度
while( nIndex-- > 0 ) { // 将字符串的字符序翻转
nTemp = pStr[ nIndex ];
pStr[ nIndex ] = pStr[ nCount - nIndex ];
pStr[ nCount - nIndex ] = nTemp;
}
}
pStr[ nCount + 1 ] = '\0'; // 置结束符
return str;
}
sunjane2 2009-01-05
  • 打赏
  • 举报
回复
我这个和标准的itoa()有点不一样,只是参数不一样,自己去看吧
void itoa(int n,char s[])
{
int i,j,k,sign;
char tmp;
if((sign=n)<0)
n=-n;
i=0;
do{
s[i++]=n%10+'0';
}
while ((n/=10)>0);
if(sign<0)
s[i++]='-';
s[i]='\0';
//printf("debug int n: %d\n",n);
//printf("debug char s: %s\n",s);
/*
for debug input int i and output char s[];
*/
for(j=i-1,k=0;j>((i-1)/2);j--,k++)
{
tmp=s[k];
s[k]=s[j];
s[j]=tmp;
}
//printf("debug str: %s\n",s);
}
lnever 2009-01-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sunjane2 的回复:]
void itoa(int n,char s[])//没考虑2、16进制
//考虑char s[]空间够用了吗?
{
int i,j,k,sign;
char tmp;
if((sign=n) <0)
n=-n;
i=0;
do{
s[i++]=n%10+'0';
}
while ((n/=10)>0);
if(sign <0)
s[i++]='-';
s[i]='\0';
//printf("debug int n: %d\n",n);
//printf("debug char s: %s\n",s);
/*
for debug input int i and output char s[];
*/
for(j=i-1,k=0;j>((i-1)/2);j--,k++)
{
tmp=s[k];
s[k]=s[j];
s[j]=tmp;
}
//printf("debug str: %s\n",s);
}

[/Quote]
xiaoyisnail 2009-01-05
  • 打赏
  • 举报
回复
转一个看看

/***
*atox.c - atoi and atol conversion
*
* Copyright (c) 1989-1997, Microsoft Corporation. All rights reserved.
*
*Purpose:
* Converts a character string into an int or long.
*
*******************************************************************************/

#include <cruntime.h>
#include <stdlib.h>
#include <ctype.h>

/***
*long atol(char *nptr) - Convert string to long
*
*Purpose:
* Converts ASCII string pointed to by nptr to binary.
* Overflow is not detected.
*
*Entry:
* nptr = ptr to string to convert
*
*Exit:
* return long int value of the string
*
*Exceptions:
* None - overflow is not detected.
*
*******************************************************************************/

long __cdecl atol(
const char *nptr
)
{
int c; /* current char */
long total; /* current total */
int sign; /* if ''-'', then negative, otherwise positive */

/* skip whitespace */
while ( isspace((int)(unsigned char)*nptr) )
++nptr;

c = (int)(unsigned char)*nptr++;
sign = c; /* save sign indication */
if (c == ''-'' || c == ''+'')
c = (int)(unsigned char)*nptr++; /* skip sign */

total = 0;

while (isdigit(c)) {
total = 10 * total + (c - ''0''); /* accumulate digit */
c = (int)(unsigned char)*nptr++; /* get next char */
}

if (sign == ''-'')
return -total;
else
return total; /* return result, negated if necessary */
}


/***
*int atoi(char *nptr) - Convert string to long
*
*Purpose:
* Converts ASCII string pointed to by nptr to binary.
* Overflow is not detected. Because of this, we can just use
* atol().
*
*Entry:
* nptr = ptr to string to convert
*
*Exit:
* return int value of the string
*
*Exceptions:
* None - overflow is not detected.
*
*******************************************************************************/

int __cdecl atoi(
const char *nptr
)
{
return (int)atol(nptr);
}

#ifndef _NO_INT64

__int64 __cdecl _atoi64(
const char *nptr
)
{
int c; /* current char */
__int64 total; /* current total */
int sign; /* if ''-'', then negative, otherwise positive */

/* skip whitespace */
while ( isspace((int)(unsigned char)*nptr) )
++nptr;

c = (int)(unsigned char)*nptr++;
sign = c; /* save sign indication */
if (c == ''-'' || c == ''+'')
c = (int)(unsigned char)*nptr++; /* skip sign */

total = 0;

while (isdigit(c)) {
total = 10 * total + (c - ''0''); /* accumulate digit */
c = (int)(unsigned char)*nptr++; /* get next char */
}

if (sign == ''-'')
return -total;
else
return total; /* return result, negated if necessary */
}

#endif /* _NO_INT64 */


#include <msvcrt/errno.h>
#include <msvcrt/stdlib.h>
#include <msvcrt/internal/file.h>
char* _itoa(int value, char* string, int radix)
{
char tmp[33];
char* tp = tmp;
int i;
unsigned v;
int sign;
char* sp;

if (radix > 36 || radix <= 1)
{
__set_errno(EDOM);
return 0;
}

sign = (radix == 10 && value < 0);
if (sign)
v = -value;
else
v = (unsigned)value;
while (v || tp == tmp)
{
i = v % radix;
v = v / radix;
if (i < 10)
*tp++ = i+''0'';
else
*tp++ = i + ''a'' - 10;
}

if (string == 0)
string = (char*)malloc((tp-tmp)+sign+1);
sp = string;

if (sign)
*sp++ = ''-'';
while (tp > tmp)
*sp++ = *--tp;
*sp = 0;
return string;
}
  • 打赏
  • 举报
回复
mark,itoa的源码不知道效率如何.
lbh2001 2009-01-05
  • 打赏
  • 举报
回复
在SDK的源代码里找找

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧