2015-07-10 44 views
0

我正在写一点操作系统,我需要能够打印添加的变量。我有一个工作atoi函数,所以我倒过来给我一个itoa函数。没有办法访问空闲内存,所以我需要弄清楚为了创建适当大小的字符数组的位数。我想我需要用10除以得到它,然后将这些值模数化到正确的位置。这是我的C代码到目前为止:如何正确实现将int转换为字符串?

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

好,一件事是你要返回临时的价值。 – imallett

+0

对于否定'int'失败。 – chux

+0

你是什么意思? - @imallett –

回答

2

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

  • 您正在返回临时值。 ret位于堆栈上,弹出后不存在。
  • 你试图动态分配堆栈上的东西。这可能确实有效,但除非你知道你在做什么,否则你不应该这样做。

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

void putc(char c) { 
    /*Output "c" via BIOS interrupt or VGA write. Or whatever.*/ 
} 
void print(int num) { 
    if (num!=0) { 
     /*Largest num is `2,147,483,64(7|8)`*/ 
     char temp[10]; 
     int i = 0; 
     if (num<0) { putc('-'); num=-num; } 
     if (num>0); else { temp[i++]='8'; num=-(num/10); } //signed wraparound 
     while (num>0) { 
      temp[i++] = num%10 + '0'; 
      num /= 10; 
     } 
     while (--i>=0) putc(temp[i]); 
    } else putc('0'); 
} 
+3

注意:无法使用INT_MIN。候选修复:'if(num <0)putc(' - '); else num = -num; char temp [10]; int i = 0; do {temp [i ++] ='0' - num%10; num/= 10; } while(num);' – chux

+1

@chux固定为未来的人的利益。现在更多的分支预测友好。我喜欢这里'-'命令的重要性。 :D – imallett

+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

如果你能忍受与主叫方提供的缓冲区足够大,所有的预期产出,那么你可以:

#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; 
    }