我正在编写一些操作系统,我需要能够打印添加变量。我有一个工作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;
}
截至目前,它什么都没打印。这有什么问题?
答案 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;
}