将整数转换为字符串而无需访问库

Nic*_*nas 12 c string int type-conversion itoa

我最近看了一个样本面试问题:

编写一个函数将整数转换为字符串.假设您无权访问库函数,即itoa()等...

你会怎么做?

Joh*_*ker 11

快速刺伤它:(编辑处理负数)

int n = INT_MIN;
char buffer[50];
int i = 0;

bool isNeg = n<0;

unsigned int n1 = isNeg ? -n : n;

while(n1!=0)
{
    buffer[i++] = n1%10+'0';
    n1=n1/10;
}

if(isNeg)
    buffer[i++] = '-';

buffer[i] = '\0';

for(int t = 0; t < i/2; t++)
{
    buffer[t] ^= buffer[i-t-1];
    buffer[i-t-1] ^= buffer[t];
    buffer[t] ^= buffer[i-t-1];
}

if(n == 0)
{
    buffer[0] = '0';
    buffer[1] = '\0';
}   

printf(buffer);
Run Code Online (Sandbox Code Playgroud)

  • 这无法在两个补码机上正确处理`INT_MIN`. (5认同)

dnb*_*ise 7

该算法很容易用英语看到.

给定一个整数,例如123

  1. 除以10 => 123/10.屈服,结果= 12,余数= 3

  2. 添加30h到3并推入堆栈(添加30h将3转换为ASCII表示)

  3. 重复步骤1直到结果<10

  4. 添加30h到结果并存储在堆栈上

  5. 堆栈按|的顺序包含数字 1 | 2 | 3 | ...

  • 添加'0'更好,而不是在常见编码中碰巧正确的神奇十六进制常量.在没有必要的情况下,无需将代码绑定到ASCII. (5认同)
  • @NicholasWilson C 标准*要求*数字数字按顺序排列;源和执行字符集。 (3认同)
  • 添加"0"**将代码绑定到ASCII - 您假设"0"..."9"按顺序排列.无论编译器的代码集如何,添加0x30都会产生ASCII输出.如果编译器的代码集是ASCII,则添加"0"会产生相同的输出,否则可能会出现乱码输出.话虽如此,如果它没有使用ASCII值作为字符常量,我会替换我的编译器! (2认同)

Ben*_*ery 6

在网上查看itoa的实现将为您提供很好的示例。这是一个,避免在结尾处反转字符串。它依赖于静态缓冲区,因此如果您将其重用于不同的值,请务必小心。

char* itoa(int val, int base){

    static char buf[32] = {0};

    int i = 30;

    for(; val && i ; --i, val /= base)

        buf[i] = "0123456789abcdef"[val % base];

    return &buf[i+1];

}
Run Code Online (Sandbox Code Playgroud)

  • 当val为0(零)时,此实现将失败。 (2认同)