首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编写itoa函数

编写itoa函数
EN

Code Review用户
提问于 2021-03-19 06:39:31
回答 1查看 203关注 0票数 0

下面是我编写的试图使用递归的基本itoa函数:

代码语言:javascript
复制
void itoa(int number, char buffer[])
{
    static int idx=0, size=0;
    if (number == 0) {
        buffer[size] = '\0';
        idx = size = 0; // reset for next call
    }
    else {
        size++, idx++;
        itoa(number/10, buffer);
        buffer[size-idx--] = (number % 10) + '0';
    }
}

看起来怎么样?由于静态的原因,它不是线程安全的,但是这是像这样的函数的问题吗?如果是的话,我如何更新呢?我还能用什么方法来改进它呢?

EN

回答 1

Code Review用户

回答已采纳

发布于 2021-03-20 01:49:41

看起来怎么样?

不怎么好。

  1. 不是线安全。
  2. 不能很好地处理负数。
  3. 使用0构成""
  4. 容易发生缓冲区溢出。
  5. itoa()不是一个标准函数,但它通常返回一个指针。

测试线束

代码语言:javascript
复制
int main(void) {
  char buf[100];
  int test[] = {123, 456, 0, - 42, INT_MAX, INT_MIN};
  int n = sizeof test / sizeof *test;
  for (int i = 0; i < n; i++) {
    itoa(test[i], buf);
    printf("%-11d <%s>\n", test[i], buf);
  }
  return 0;
}

输出

代码语言:javascript
复制
123         <123>
456         <456>
0           <>
-42         <,.>
2147483647  <2147483647>
-2147483648 <./,),(-*,(>

由于静态的原因,它不是线程安全的,但是这是像这样的函数的问题吗?

是。预期线程安全。

如果是的话,我如何更新呢?我还能用什么方法来改进它呢?

我真的不认为这是一个使用递归的好地方,因为缓冲区溢出的可能性是一个相当复杂的问题。

但是,如果必须使用递归,请考虑为各种int (包括0, INT_MAX, INT_MIN )添加错误检查和测试。

代码语言:javascript
复制
static char* itoa_helper(int number, size_t sz, char buffer[]) {
  if (sz == 0) {
    return NULL;
  }
  if (number <= -10) {
    buffer = itoa_helper(number / 10, sz - 1, buffer);
    if (buffer == NULL) {
      return NULL;
    }
    number %= 10;
  }
  *buffer = (char) ('0' - number);
  return buffer + 1;
}

char* itoa_recursive_alt(int number, size_t sz, char buffer[sz]) {
  if (sz == 0 || buffer == NULL) {
    return NULL;
  }
  char *s = buffer;

  if (number >= 0) {
    // Flip pos numbers to neg as neg range is greater.
    number = -number;
  } else {
    sz--;
    if (sz == 0) {
      *buffer = '\0';
      return NULL;
    }
    *s++ = '-';
  }
  s = itoa_helper(number, sz-1, s);
  if (s == NULL) {
    *buffer = '\0';
    return NULL;
  }
  *s = 0;
  return buffer;
}

int main(void) {
  char buf[100];
  int test[] = {123, 456, 0, -42, INT_MAX, INT_MIN};
  int n = sizeof test / sizeof *test;
  for (int i = 0; i < n; i++) {
    // char *s = itoa_recursive_alt(test[i], sizeof buf, buf);
    char *s = itoa_recursive_alt(test[i], sizeof buf, buf);
    if (s == NULL)
      s = "NULL";
    printf("%-11d <%s> <%s>\n", test[i], s, buf);
  }
  return 0;
}

输出

代码语言:javascript
复制
123         <123> <123>
456         <456> <456>
0           <0> <0>
-42         <-42> <-42>
2147483647  <2147483647> <2147483647>
-2147483648 <-2147483648> <-2147483648>
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/257387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档