其實atoi比較簡單些。一般處理也簡單(無須考慮基數等問題,預設10為底),無非要注意符号的處理和可能的空格處理。
#include <ctype.h>
int yang_atoi ( const char * str )
{
int n=0;
int sign;
char *p = (char *)str;
while(isspace(*p))
++p;
sign = (*p == '-')?-1:1;
if((*p == '+')||(*p)=='-')
++p;
while(isdigit(*p))
n = 10 *n + (*p++ - '0');
return sign > 0 ? n : -n;
}
itoa的比較複雜些,其預設原型為
char * itoa ( int value, char * result, int base )
很可惜,其在Linux下無相應的實作。官方給出建議是可以用sprintf實作。
/*
* A standard-compliant alternative for some cases may be sprintf:
* */
當然,sprintf隻能有8,10,16相應的版本給出。
sprintf(str,"%d",value) converts to decimal base.
sprintf(str,"%x",value) converts to hexadecimal base.
sprintf(str,"%o",value) converts to octal base.
是以還是有必要實作下的。
基本思路是數學上的知識,在此不表,最後儲存的字元串要翻轉,才是我們正常讀的方式。
ps:非常坑爹的是Linux下strrev也沒有實作,哎。自己動手實作了一個非标準的——擴充成strrev也友善。
void strreverse(char* begin, char* end)
{
char aux;
while(begin < end)
aux=*end, *end--=*begin, *begin++=aux;
}
strrev版本
#include <string.h>
void strrev(char* str)
{
size_t len = strlen(str);
strreverse(str,str+len-1);
}
itoa的最終版本
/*
* A standard-compliant alternative for some cases may be sprintf:
* */
char * yang_itoa ( int value, char * result, int base )
{
static const char * str = "0123456789abcdef";
char * ptr = result;
int sign = 1;
if((base < 2 )||(base > 16))
*result = '\0';
if(value < 0)
value = -value,sign = -1;
do{
*ptr++ = str[value % base];
value /= base;
}while(value);//while(value =/base);
if((sign < 0 )&&(base == 10))
*ptr++ = '-';
if(!(base % 16))
*ptr ++ = 'x';
if(!(base % 8))
*ptr++ ='0';
*ptr = '\0';
strreverse(result,ptr-1);
return result;
}
該版本給出了當為十六進制的時候類似輸出0x6b。
找到一個版本
http://www.strudel.org.uk/itoa/
View Code
/**
* C++ version 0.4 char* style "itoa":
* Written by Lukás Chmela
* Released under GPLv3.
*/
char* itoa(int value, char* result, int base) {
// check that the base if valid
if (base < 2 || base > 36) { *result = '\0'; return result; }
char* ptr = result, *ptr1 = result, tmp_char;
int tmp_value;
do {
tmp_value = value;
value /= base;
*ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)];
} while ( value );
// Apply negative sign
if (tmp_value < 0) *ptr++ = '-';
*ptr-- = '\0';
while(ptr1 < ptr) {
tmp_char = *ptr;
*ptr--= *ptr1;
*ptr1++ = tmp_char;
}
return result;
}
轉載于:https://www.cnblogs.com/westfly/archive/2011/08/22/2149898.html