繁体   English   中英

您如何正确实现将int转换为字符串?

[英]How do you properly implement turning an int into a string?

我正在写一些操作系统,并且需要能够打印出变量的附加内容。 我有一个正常的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;
}

截至目前,它不打印任何内容。 怎么了

它有一些错误。 这是至少可以使用正数的工作版本:

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

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

  • 您正在返回临时值。 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');
}

如果您可以忍受调用者提供足以容纳所有预期输出的缓冲区,那么您可以:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM