-1

例如,我必须编写一个实现itoa,其中输出表示包含在一个数组v中。数组格式必须如下:

v[0] - the length of number (in digits)
v[1] ... v[v[0]] - the number's digits, as chars in reversed order

例子:

n = 123 => v = ['3', '3', '2', '1']

下面是我的itoa实现,但我只能让它适用于恰好包含三位数的数字。你能指出我正确的方向吗?我做错了什么或我错过了什么?几个小时以来,我一直在努力解决这个问题。

char* build_number(int n)
{
    int i = 1;
    char *v = NULL;
    v = (char*) calloc(1, sizeof(char));

    while (n > 0)
    {
        v[i] = '0' + (n % 10);
        n /= 10;
        v = realloc(v, i);
        i ++;
    }
    v[0] = '0' + (i - 1);
    return v;
}
4

2 回答 2

0

可能的解决方案:

char * _my_itoa( int i )
{
    static char res[11]; // buffer for max 4G value
    char * p = res + sizeof res - 1; // pointer to end of buffer
    *p-- = 0; // 0 - end of string
    while ( i > 0 )
    {
      *p-- = (char)( ( i % 10 ) + '0' );
      i /= 10;
    }
    return p;
}
于 2014-12-09T15:29:05.933 回答
0

假设您仅限于使用 C 而不是 C++,这应该可以解决问题。您尚未指定是否或如何支持负值,因此您需要考虑这一点。如果您不打算支持负值,则您的函数应该接受 anunsigned int而不是 an int(您必须更改初始内存分配的大小以考虑可能数字的增加)。

#include <stdio.h>
#include <stdlib.h>

char* buildNumber(int n)
{
    int count = 0;
    char* v = calloc(11, sizeof(char));

    for (int i = n; i > 0; i /= 10) {
        v[++count] = i % 10 + '0';
    }

    v[0] = count + '0';
    return realloc(v, count + 1);
}

int main()
{
    char* v = buildNumber(1800);
    printf("%s", v); /* Prints 40081 */
    free(v);
}
于 2014-12-09T15:56:58.833 回答