读书人

求itoa修改,该如何解决

发布时间: 2012-06-05 13:54:06 作者: rapoo

求itoa修改
写了个递归的itoa

void change(char *p,int n)
{
int temp=n;
static int count=0;
if(temp>1)
{
temp=n/10;
change(p,temp);
p[count]=temp%10+'0';
count++;

}
}

现在的问题是n的个位数无法存储。应该是temp=n/10已经除了的后果,有什么办法能改正么??

[解决办法]

C/C++ code
void change(char *p,int n){    int temp=n;    static int count=0;    if(temp>0)    {        temp=n/10;        change(p,temp);        p[count]=n%10+'0';        count++;    }}
[解决办法]
msvcrt.dll _itoa (352) (0x0000C055)
Assembly code
0x77bec017 837c240800     cmp     dword ptr [esp+0x8],0x0    ; <==0x77BEC073(*+0x5C), 0x77BEC09A(*+0x83), 0x77BEC0B4(*+0x9D)0x77bec01c 7406           jz      0x77bec024    ; (*+0x8) 0x77bec01e c6012d         mov     byte ptr [ecx],0x2d0x77bec021 41             inc     ecx0x77bec022 f7d8           neg     eax0x77bec024 56             push    esi    ; <==0x77BEC01C(*-0x8)0x77bec025 8bf1           mov     esi,ecx0x77bec027 33d2           xor     edx,edx    ; <==0x77BEC03F(*+0x18)0x77bec029 f7742408       div     dword ptr [esp+0x8]0x77bec02d 83fa09         cmp     edx,0x90x77bec030 7605           jbe     0x77bec037    ; (*+0x7) 0x77bec032 80c257         add     dl,0x570x77bec035 eb03           jmp     0x77bec03a    ; (*+0x5) 0x77bec037 80c230         add     dl,0x30    ; <==0x77BEC030(*-0x7)0x77bec03a 8811           mov     [ecx],dl    ; <==0x77BEC035(*-0x5)0x77bec03c 41             inc     ecx0x77bec03d 85c0           test    eax,eax0x77bec03f 77e6           ja      0x77bec027    ; (*-0x18) 0x77bec041 802100         and     byte ptr [ecx],0x00x77bec044 49             dec     ecx0x77bec045 8a16           mov     dl,[esi]    ; <==0x77BEC051(*+0xC)0x77bec047 8a01           mov     al,[ecx]0x77bec049 8811           mov     [ecx],dl0x77bec04b 49             dec     ecx0x77bec04c 8806           mov     [esi],al0x77bec04e 46             inc     esi0x77bec04f 3bf1           cmp     esi,ecx0x77bec051 72f2           jb      0x77bec045    ; (*-0xC) 0x77bec053 5e             pop     esi0x77bec054 c3             ret;********************************************************************************    ; *** _itoa (352) ***    ; SYM:itoa#C0550x77bec055 55             push    ebp0x77bec056 8bec           mov     ebp,esp0x77bec058 837d100a       cmp     dword ptr [ebp+0x10],0xa0x77bec05c 8b4508         mov     eax,[ebp+0x8]0x77bec05f 750a           jnz     0x77bec06b    ; (*+0xC) 0x77bec061 85c0           test    eax,eax0x77bec063 7d06           jge     0x77bec06b    ; (*+0x8) 0x77bec065 6a01           push    0x10x77bec067 6a0a           push    0xa0x77bec069 eb05           jmp     0x77bec070    ; (*+0x7) 0x77bec06b 6a00           push    0x0    ; <==0x77BEC05F(*-0xC), 0x77BEC063(*-0x8)0x77bec06d ff7510         push    dword ptr [ebp+0x10]0x77bec070 8b4d0c         mov     ecx,[ebp+0xc]    ; <==0x77BEC069(*-0x7)0x77bec073 e89fffffff     call    0x77bec0170x77bec078 8b450c         mov     eax,[ebp+0xc]0x77bec07b 59             pop     ecx0x77bec07c 59             pop     ecx0x77bec07d 5d             pop     ebp0x77bec07e c3             ret;********************************************************************************    ; *** _ltoa (371) ***    ; SYM:ltoa#C07F0x77bec07f 55             push    ebp0x77bec080 8bec           mov     ebp,esp0x77bec082 33c0           xor     eax,eax0x77bec084 837d100a       cmp     dword ptr [ebp+0x10],0xa0x77bec088 7506           jnz     0x77bec090    ; (*+0x8) 0x77bec08a 394508         cmp     [ebp+0x8],eax0x77bec08d 7d01           jge     0x77bec090    ; (*+0x3) 0x77bec08f 40             inc     eax0x77bec090 8b4d0c         mov     ecx,[ebp+0xc]    ; <==0x77BEC088(*-0x8), 0x77BEC08D(*-0x3)0x77bec093 50             push    eax0x77bec094 ff7510         push    dword ptr [ebp+0x10]0x77bec097 8b4508         mov     eax,[ebp+0x8]0x77bec09a e878ffffff     call    0x77bec0170x77bec09f 8b450c         mov     eax,[ebp+0xc]0x77bec0a2 59             pop     ecx0x77bec0a3 59             pop     ecx0x77bec0a4 5d             pop     ebp0x77bec0a5 c3             ret;********************************************************************************    ; *** _ultoa (531) ***    ; SYM:ultoa#C0A60x77bec0a6 8b4c2408       mov     ecx,[esp+0x8]0x77bec0aa 8b442404       mov     eax,[esp+0x4]0x77bec0ae 6a00           push    0x00x77bec0b0 ff742410       push    dword ptr [esp+0x10]0x77bec0b4 e85effffff     call    0x77bec0170x77bec0b9 8b442410       mov     eax,[esp+0x10]0x77bec0bd 59             pop     ecx0x77bec0be 59             pop     ecx0x77bec0bf c3             ret;********************************************************************************0x77bec0c0 55             push    ebp    ; <==0x77BEC154(*+0x94)0x77bec0c1 8bec           mov     ebp,esp0x77bec0c3 51             push    ecx0x77bec0c4 51             push    ecx0x77bec0c5 53             push    ebx0x77bec0c6 8b5d08         mov     ebx,[ebp+0x8]0x77bec0c9 56             push    esi0x77bec0ca 33c9           xor     ecx,ecx0x77bec0cc 394d14         cmp     [ebp+0x14],ecx0x77bec0cf 8bf0           mov     esi,eax0x77bec0d1 8b450c         mov     eax,[ebp+0xc]0x77bec0d4 57             push    edi0x77bec0d5 740a           jz      0x77bec0e1    ; (*+0xC) 0x77bec0d7 c6062d         mov     byte ptr [esi],0x2d0x77bec0da 46             inc     esi0x77bec0db f7db           neg     ebx0x77bec0dd 13c1           adc     eax,ecx0x77bec0df f7d8           neg     eax0x77bec0e1 8bfe           mov     edi,esi    ; <==0x77BEC0D5(*-0xC)0x77bec0e3 894d0c         mov     [ebp+0xc],ecx0x77bec0e6 ff750c         push    dword ptr [ebp+0xc]    ; <==0x77BEC10C(*+0x26), 0x77BEC112(*+0x2C)0x77bec0e9 ff7510         push    dword ptr [ebp+0x10]0x77bec0ec 50             push    eax0x77bec0ed 53             push    ebx0x77bec0ee e88df10000     call    0x77bfb2800x77bec0f3 83f909         cmp     ecx,0x90x77bec0f6 895dfc         mov     [ebp-0x4],ebx0x77bec0f9 8bd8           mov     ebx,eax0x77bec0fb 8bc2           mov     eax,edx0x77bec0fd 7605           jbe     0x77bec104    ; (*+0x7) 0x77bec0ff 80c157         add     cl,0x570x77bec102 eb03           jmp     0x77bec107    ; (*+0x5) 0x77bec104 80c130         add     cl,0x30    ; <==0x77BEC0FD(*-0x7)0x77bec107 880e           mov     [esi],cl    ; <==0x77BEC102(*-0x5)0x77bec109 46             inc     esi0x77bec10a 85c0           test    eax,eax0x77bec10c 77d8           ja      0x77bec0e6    ; (*-0x26) 0x77bec10e 7204           jb      0x77bec114    ; (*+0x6) 0x77bec110 85db           test    ebx,ebx0x77bec112 77d2           ja      0x77bec0e6    ; (*-0x2C) 0x77bec114 802600         and     byte ptr [esi],0x0    ; <==0x77BEC10E(*-0x6)0x77bec117 4e             dec     esi0x77bec118 8a0f           mov     cl,[edi]    ; <==0x77BEC124(*+0xC)0x77bec11a 8a06           mov     al,[esi]0x77bec11c 880e           mov     [esi],cl0x77bec11e 4e             dec     esi0x77bec11f 8807           mov     [edi],al0x77bec121 47             inc     edi0x77bec122 3bfe           cmp     edi,esi0x77bec124 72f2           jb      0x77bec118    ; (*-0xC) 0x77bec126 5f             pop     edi0x77bec127 5e             pop     esi0x77bec128 5b             pop     ebx0x77bec129 c9             leave0x77bec12a c21000         ret     0x10;********************************************************************************    ; *** _i64toa (313) ***    ; SYM:i64toa#C12D0x77bec12d 55             push    ebp0x77bec12e 8bec           mov     ebp,esp0x77bec130 33c0           xor     eax,eax0x77bec132 837d140a       cmp     dword ptr [ebp+0x14],0xa0x77bec136 750f           jnz     0x77bec147    ; (*+0x11) 0x77bec138 39450c         cmp     [ebp+0xc],eax0x77bec13b 7f0a           jg      0x77bec147    ; (*+0xC) 0x77bec13d 7c05           jl      0x77bec144    ; (*+0x7) 0x77bec13f 394508         cmp     [ebp+0x8],eax0x77bec142 7303           jae     0x77bec147    ; (*+0x5) 0x77bec144 33c0           xor     eax,eax    ; <==0x77BEC13D(*-0x7)0x77bec146 40             inc     eax0x77bec147 50             push    eax    ; <==0x77BEC142(*-0x5), 0x77BEC136(*-0x11), 0x77BEC13B(*-0xC)0x77bec148 ff7514         push    dword ptr [ebp+0x14]0x77bec14b 8b4510         mov     eax,[ebp+0x10]0x77bec14e ff750c         push    dword ptr [ebp+0xc]0x77bec151 ff7508         push    dword ptr [ebp+0x8]0x77bec154 e867ffffff     call    0x77bec0c00x77bec159 8b4510         mov     eax,[ebp+0x10] 


[解决办法]
如此小事竟然递归, 蛋疼吗?

C/C++ code
#include <stdio.h>#include <stdlib.h>#include <string.h>int itoa_r(int n, char *asc) {        if (n == 0) {                return 0;        }        int ndx = itoa_r(n / 10, asc);        asc[ndx] = '0' + n % 10;        return ndx + 1;}int main(int argc, char* const argv[]) {        char asc[100];        int i = 0;        for ( ; i < 50; ++ i) {                int ret = itoa_r(i, asc);                printf("%.*s\n", ret, asc);        }        return 0;} 

读书人网 >C++

热点推荐