求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;}