Обычай ITOA не работает, верно?
Я хотел создать специальную функцию ITOA, чтобы помещать большие числа в маленькие строки, вот что я кодировал:
main(){
printf("itoa(2000000000,36)= '%s'",itoa(2000000000,36));
printf("itoa(36,36)= '%s'",itoa(36,36));
printf("itoa(37,36)= '%s'",itoa(37,36));
return 1;
}
stock itoa(val, base)
{
new buf[1024] = {0,...};
new i = 1023;
new LETTERZ[37] = {'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',0};
for(; val && i; --i, val /= base)
buf[i] = LETTERZ[val % base];
return buf[i+1];
}
Он основан на коде 'C' с этой страницы: http://www.jb.man.ac.uk/~slowe/cpp/itoa.html
Но как-то это вывод:
[20:34:35] itoa (2000000000,36) = 'X' [20:34:35] itoa (36,36) = '1' [20:34:35] itoa (37,36) = '1 '
И это совершенно неправильно, я не знаю, какой выход ожидать, но 36 и 37 наверняка не могут быть одинаковыми, а 2 000 000 000 не могут быть просто "Х", поскольку Х предполагается 35, не 2 000 000 000, ZZ должно быть 1295 Я думаю... Я хочу основать это на шестнадцатеричной системе, но со всеми буквами алфавита.
Кто-нибудь может сказать мне, что здесь не так?
Я работаю с типизированным языком PAWN (также известным как SMALL) и позже я хочу использовать этот код в VB.NET
2 ответа
Решение казалось простым, return buf[i+1] просто возвращал один символ, поэтому я сделал так, чтобы он возвращал массив:
new _s@T[4096];
#define sprintf(%1) (format(_s@T, SPRINTF_MAX_STRING, %1), _s@T)
main(){
new num = atoi("ABCDEFG",36);
printf("%d",num);
printf("%s",itoa(num,36));
return 1;
}
stock itoa(val, base)
{
new buf[1024] = {0,...};
new LETTERZ[37] = {'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',0};
for(new pos = 0; val;++pos,val = floatround(val/base,floatround_floor))
strins(buf,sprintf("%c",LETTERZ[val % base]),0);
return buf;
}
stock atoi(val[], base)
{
new CURRNUM = 0;
new len = strlen(val);
new LETTERZ[37] = {'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',0};
for(new i = 0; i < len; ++i)
{
for(new x = 0; x < base; ++x)
{
new y = (len-i)-1;
if(val[y] == LETTERZ[x])
{
CURRNUM += x*floatround(floatpower(base,i));
}
}
}
return CURRNUM;
}
/* itoa example */
#include <stdio.h>
#include <stdlib.h>
int main ()
{
int i;
char buffer [33];
printf ("Enter a number: ");
scanf ("%d",&i);
itoa (i,buffer,10);
printf ("decimal: %s\n",buffer);
itoa (i,buffer,16);
printf ("hexadecimal: %s\n",buffer);
itoa (i,buffer,2);
printf ("binary: %s\n",buffer);
return 0;
}
Вы только даете число и основание, но для параметра 2 нужен указатель на уже выделенный символ. Используйте буфер или попробуйте NULL, чтобы функция вернула результат.