The Daily WTF for 2008-11-28 pailories 以下代码:
static char *nice_num(long n)
{
int neg = 0, d = 3;
char *buffer = prtbuf;
int bufsize = 20;
if (n < 0)
{
neg = 1;
n = -n;
}
buffer += bufsize;
*--buffer = '\0';
do
{
*--buffer = '0' + (n % 10);
n /= 10;
if (--d == 0)
{
d = 3;
*--buffer = ',';
}
}
while (n);
if (*buffer == ',') ++buffer;
if (neg) *--buffer = '-';
return buffer;
}
你会怎么写?
最佳答案
如果您是一位经验丰富的 C 程序员,您会意识到这段代码实际上并没有那么糟糕。它相对简单(对于 C),而且速度非常快。它存在三个问题:
问题#1 可以通过特殊情况轻松解决。为了解决#2,我将代码分成两个函数,一个用于 32 位整数,一个用于 64 位整数。 #3 有点难 - 我们必须更改接口(interface)以使其完全线程安全。
这是我的解决方案,基于此代码但经过修改以解决这些问题:
static int nice_num(char *buffer, size_t len, int32_t n)
{
int neg = 0, d = 3;
char buf[16];
size_t bufsize = sizeof(buf);
char *pbuf = buf + bufsize;
if(n < 0)
{
if(n == INT32_MIN)
{
strncpy(buffer, "-2,147,483,648", len);
return len <= 14;
}
neg = 1;
n = -n;
}
*--pbuf = '\0';
do
{
*--pbuf = '0' + (n % 10);
n /= 10;
if(--d == 0)
{
d = 3;
*--pbuf = ',';
}
}
while(n > 0);
if(*pbuf == ',') ++pbuf;
if(neg) *--pbuf = '-';
strncpy(buffer, pbuf, len);
return len <= strlen(pbuf);
}
说明:它在堆栈上创建一个本地缓冲区,然后用与初始代码相同的方法填充它。然后,它将它复制到传递给函数的参数中,确保不会溢出缓冲区。它还有一个 INT32_MIN 的特例。如果原始缓冲区足够大,则返回值为 0;如果缓冲区太小且结果字符串被截断,则返回值为 1。
关于c - 您将如何在 Daily WTF 中实现被 mock 的功能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/327216/