您如何正确实现将 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] = '[=10=]';
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] = '[=10=]';
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='[=10=]';
}
else
{
if(num<0){
*output++='-';
num=-num;
};
*rIntToAscii(num, output) = '[=10=]';
};
};
int main(void)
{
int test = -10;
char testOutput[ 32 ];
intToAscii(test,testOutput);
printf( "%s", testOutput );
return 0;
}
我正在编写一些操作系统,我需要能够打印添加的变量。我有一个工作的 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] = '[=10=]';
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] = '[=10=]';
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='[=10=]';
}
else
{
if(num<0){
*output++='-';
num=-num;
};
*rIntToAscii(num, output) = '[=10=]';
};
};
int main(void)
{
int test = -10;
char testOutput[ 32 ];
intToAscii(test,testOutput);
printf( "%s", testOutput );
return 0;
}