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)
该算法很容易用英语看到.
给定一个整数,例如123
除以10 => 123/10.屈服,结果= 12,余数= 3
添加30h到3并推入堆栈(添加30h将3转换为ASCII表示)
重复步骤1直到结果<10
添加30h到结果并存储在堆栈上
堆栈按|的顺序包含数字 1 | 2 | 3 | ...
在网上查看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)