1

大きな数値を小さな文字列に入れるためのカスタム 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 を単に「X」にすることはできません。X は 35 であると想定されているためです。 2 000 000 000 ではなく、ZZ は 1295 である必要があると思います... これは 16 進数システムに基づいていますが、すべてのアルファベット文字を使用します。

ここで何が問題なのか誰か教えてもらえますか?

私は PAWN (SMALL とも呼ばれます) と呼ばれる型のない言語を使用していますが、後でこのコードを VB.NET で使用したいと考えています。

4

2 に答える 2

0

解決策は単純なようで、return buf [i + 1]は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;
}
于 2012-09-07T22:36:15.577 に答える
0
/* 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 には、既に割り当てられている char へのポインターが必要です。関数が結果を返すように、バッファを使用するか NULL を試してください。

于 2012-09-07T18:48:28.280 に答える