怎么写我自己的itoa?

时间:2014-12-09 15:24:51

标签: string function pointers integer itoa

必须写一个函数,其中v [0]是数字的长度,而v [1] ... v [v [0]]是反转数字的表示,即对于n = 123,v这是我到目前为止所写的内容,它仅适用于3位数字。为什么?

char* build_number(int n)
{
int i=1;
char *v;
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;
}

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

试试这个:

// Assuming n is not negative

if (n == 0) {
    char *v = malloc(2 * sizeof(char));
    v[0] = '1';
    v[1] = '0';
    return v;
}

// Count the number of digits
int temp = n;
int count = 0;
while (temp > 0) {
    count++;
    temp /= 10;
}

char *v = malloc((count + 1) * sizeof(char));
v[0] = count + '0';
int pos = count;
while (n > 0) {
    v[pos] = (n % 10) + '0';
    n /= 10;
    pos--;
}

return v;

答案 2 :(得分:0)

假设您仅限于使用C而不是C ++,这应该可以解决问题。您尚未指定是否或如何支持负值,因此您需要考虑这一点。如果您不打算支持负值,则您的函数应接受unsigned int而不是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);
}