它是GCC的功能

时间:2013-08-05 15:12:00

标签: c

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/baseval%base之间的区别是什么?

2 个答案:

答案 0 :(得分: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(它也是表示数字的字符数组的索引(非常有效)

答案 1 :(得分:1)

1)静态字符buf [32] 为什么要用静电?我可以删除吗?

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

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

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

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

Value =(Value / divisor)* divisor + Value%divisor。

感谢