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];
}
我的问题
static char buf[32]
为何使用静电?我可以删除吗?
为什么i=30
?
不应该是31吗? 32位为0到31。
对于for循环,val /= base
尝试做什么?
在for循环中,val%base
做了什么?我知道这是剩余的,但这与这里有什么关系? val/base
与val%base
之间的区别是什么?
答案 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。
感谢