2015-07-10 45 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; 
    }