你如何正确地将int转换为字符串?

时间:2015-07-10 01:30:25

标签: c osdev itoa

我正在编写一些操作系统,我需要能够打印添加变量。我有一个工作atoi功能,所以我扭转它给我一个itoa功能。没有办法访问空闲内存,所以我需要弄清楚数字的位数,以便创建适当大小的char数组。我想我需要除以10得到它,然后将值模数到正确的位置。到目前为止,这是我的c代码:

char* itoa(int res) {
    int size = 0;
    int t = res;

    while(t / 10 != 0) {
        t = t/10;
        size ++;
    }
    char ret[size+1];
    ret[size] = '\0';

    t = res;
    int i = size - 1;
    while(i > 0) {
        ret[i] = t % 10;
        t = t/10;
        i--;
    }

    return ret;
}

截至目前,它什么都没打印。这有什么问题?

3 个答案:

答案 0 :(得分:3)

它有一些错误。这里至少是正数的工作版本:

char* itoa(int res) {
    int size = 0;
    int t = res;

    while(t / 10 != 0) {
        t = t/10;
        size++;
    }
    static char ret[64];
    size++;
    ret[size] = '\0';
    t = res;
    int i = size - 1;
    while(i >= 0) {
        ret[i] = (t % 10) + '0';
        t = t/10;
        i--;
    }

    return ret;
}

答案 1 :(得分:2)

这里有很多错误。最明显的是:

  • 您正在返回临时值。 #iframe在堆栈中,弹出后不存在。
  • 您正试图在堆栈上动态分配内容。这可能确实有效,但除非你知道自己在做什么,否则你不应该这样做。

放在一起,这些基本上会杀死你的实现。所以,为了提供帮助,这里有一些 un 测试代码:

ret

答案 2 :(得分:1)

如果您能够让调用者提供足够大的缓冲区以满足所有预期输出,那么您可以:

#include <stdio.h> 

    char * rIntToAscii(int num, char * result){ 
        if( num == 0 ) return result; 
        else{ 
             result=rIntToAscii( num/10, result );
             *result = '0'+num%10;
            return result+1; 
        } 
    };

    void intToAscii(int num,char *output){
      if (num==0){
        *output++='0';
        *output='\0';
      }
        else
        {
          if(num<0){
            *output++='-';
            num=-num;
          };
          *rIntToAscii(num, output) = '\0';
        };
    };

    int main(void) 
    { 
        int test = -10;
        char testOutput[ 32 ];
        intToAscii(test,testOutput);
        printf( "%s", testOutput );
        return 0; 
    }