【问题标题】:custom ITOA not working right?自定义 ITOA 无法正常工作?
【发布时间】:2012-09-07 18:38:20
【问题描述】:

我想制作一个自定义 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 我想...我想以十六进制系统为基础,但使用所有 alfabet 字母。

谁能告诉我这里出了什么问题?

我正在使用一种称为 PAWN(也称为 SMALL)的无类型语言,后来我想在 VB.NET 中使用此代码

【问题讨论】:

  • 我将假设不赞成票是因为此代码甚至无法编译。如果我们看不到运行的代码,我们如何知道导致该输出的原因?
  • 用于 PAWN :x PAWN 编译器可以从:compuphase.com/pawn/pawn.htm#DOWNLOAD_WIN

标签: converter itoa pawn


【解决方案1】:
/* 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,因此函数将返回结果。

【讨论】:

  • itoa 在 pawn 中不存在,一,二,itoa 没有基数 36,只有基数:十进制、二进制、十六进制、八进制等
【解决方案2】:

解决方案似乎很简单,返回 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;
}

【讨论】:

    猜你喜欢
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 2016-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多