-3

itoa不是 ANSI-C 标准,因此不适用于 GCC

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];

}

我的问题

  1. static char buf[32]
    为什么要使用静态?我可以删除那个吗?

  2. 为什么i=30
    不应该是31吗?32 位为 0 到 31。

  3. 对于for循环,val /= base试图做什么?

  4. 在for循环内部,做了val%base什么?我知道这是剩余的,但这与这里有什么关系?val/basevs 和有什么不一样val%base

4

2 回答 2

3

1)正如@Blastfurnace所指出的,需要静态以便在函数返回时缓冲区仍然存在

2) i=30 因为它是最后使用的索引,因为索引 31 需要为 NULL (\0)。因为 c 与 Null-Terminated-Strings 一起使用

3)删除最后一个数字。即:val = 12345, base = 10, val / base = 1234, 5 被删除

4)获取当前数字(从右到左),12345 % 10 = 5(它也是代表数字的char数组的索引(非常有效)

于 2013-08-05T15:23:04.367 回答
1

1)static char buf[32] 为什么使用静态?我可以删除吗?

因此,每次调用例程时都不会重新加载它。不,例程需要它来存储要输出的 ascii 值。

2)为什么我=30?不应该是31吗?0 到 31 表示 32 位 不确定,但 30 个字符表示 120 位,而不是 30。

3) 对于 for 循环, val /=base 试图做什么?它减少了每次迭代的基数,因此剩余值(用作数组的索引)将是正确的。

4) 在 for 循环中,val%base 做了什么?我知道这是剩余的,但这与这里有什么关系?val/base 与 val%base 有什么区别?它计算余数作为 buf 的索引,以选择正确的 ascii 值。/ 返回整数(四舍五入)除法,而不是该除法的余数。

值 = (值/除数)*除数 + 值%除数。

谢谢

于 2013-08-05T15:23:24.463 回答