w****x 发帖数: 2483 | 1 const char* myitoa(int num, char str[])
{
assert(a);
char* pIterBeg = str;
if (num < 0)
{
num = -num;
*pIterBeg++ = '-';
}
//use long not short to avoid INT_MIN overflow
unsigned int numshort = num;
char* pIter = pIterBeg;
while (true)
{
*pIter++ = numshort%10 + '0';
numshort = numshort/10;
if (numshort == 0) break;
}
*pIter = 0;
int nLen = strlen(pIterBeg);
assert(nLen > 0);
char* pIterEnd = pIterBeg + nLen - 1;
while (pIterEnd > pIterBeg)
swap(*pIterBeg++, *pIterEnd--);
return str;
}
///////////////////////////////////////////////////////////
一次写对一个itoa真的好难!!! 一点都不简单, atoi更难. |
w****x 发帖数: 2483 | |
v***a 发帖数: 365 | 3 有错呢,而且
你那 while (true) 有些豪放,do {} while
求 len 有意义么,
有 pIter 了干嘛还求 pIterEnd 呢,不一样么
assert 有什么用,把调用你函数的程序直接搞死了,扔个NULL或者抛个异常都很好啊
【在 w****x 的大作中提到】 : const char* myitoa(int num, char str[]) : { : assert(a); : char* pIterBeg = str; : if (num < 0) : { : num = -num; : *pIterBeg++ = '-'; : } : //use long not short to avoid INT_MIN overflow
|
w****x 发帖数: 2483 | 4
const char* myitoa(int num, char str[])
{
char* pIterBeg = str;
if (num < 0)
{
num = -num;
*pIterBeg++ = '-';
}
unsigned int numshort = num; //avoid INT_MIN overflow
char* pIter = pIterBeg;
do
{
*pIter++ = numshort%10 + '0';
numshort = numshort/10;
}while (numshort != 0);
*pIter = 0;
char* pIterEnd = pIter - 1;
while (pIterEnd > pIterBeg)
swap(*pIterBeg++, *pIterEnd--);
return str;
}
谢谢提醒, 修改版本
【在 v***a 的大作中提到】 : 有错呢,而且 : 你那 while (true) 有些豪放,do {} while : 求 len 有意义么, : 有 pIter 了干嘛还求 pIterEnd 呢,不一样么 : assert 有什么用,把调用你函数的程序直接搞死了,扔个NULL或者抛个异常都很好啊
|
w****x 发帖数: 2483 | 5 assert是在debug版本里暴露逻辑错误的, release不管
pIterEnd看上去比较清楚一些, 和pIterBeg对应 |
v***a 发帖数: 365 | 6 你觉得好就好了,但还是有错啊
【在 w****x 的大作中提到】 : assert是在debug版本里暴露逻辑错误的, release不管 : pIterEnd看上去比较清楚一些, 和pIterBeg对应
|
S******t 发帖数: 151 | 7 弱问一下,如果itoa的实现直接暴力sprintf去了,这个可以么…… |
y****e 发帖数: 1012 | 8 同问~~~
如果不行,是不是只需要支持2,8,26,20进制的数?
【在 S******t 的大作中提到】 : 弱问一下,如果itoa的实现直接暴力sprintf去了,这个可以么……
|