int的范围是-2147483648到+2147483648之间,共11位,即(正负21亿之间)
思路:将正整数的每一位都拿出来,依次转化为字符,再将所有的字符连接起来得到字符串
将int分为三种情况:
- 0
- 负数
- 正数
#include <iostream>
#include <cstring>
#include <cstdio>
#include <stack>
using namespace std;
char* myitoa(int num)
{
//1.因为一个变量的生命周期在函数体内就会结束(类似静态变量),所以内存分配必须在堆上(使用malloc),否则局部变量失效
//2.字符串的末尾还需要\0表示结束,所以需要11 + 1 = 12位
//3.malloc实际上申请了一个字符数组
char *res = (char*)malloc(sizeof(char*) * 12);
//1.num为0
if (num == 0)
{
res[0] = '0';
res[1] = '\0';
return res;
}
//2.num为负数,则将其转换为正数
int flag = 0;
if (num < 0)
{
//flag == 1表示num为负数
flag = 1;
num = -num;
}
//3.num为正数,将正数转化为字符串
//将每一位的整数转化为字符,并定义字符类型的数组tem用来存储
//定义t来暂存要转化的num
char tem[12];
int t = num,i = 0;
while (t > 0)
{
//5 + '0'可将一位数字5转换为字符'5'
//下面两行代码可将1234 -> '4321'(逆置)并存储在字符数组tem中
tem[i++] = t % 10 + '0';
t /= 10;
}
//如果num负数,还需要将符号添加在字符数组的最后,如-1234 -> '4321-'
if (flag) tem[i++] = '-';
//再逆置tem数组(还原整数),降'4321' -> '1234'
int j,k;
for(j = 0,k = i - 1;j <= i - 1;j++,k--)
{
//j指针从前往后,k指针从后往前遍历,把temp里面的字符放到结果中
res[j] = tem[k];
}
//结果数组的末尾为字符结束符
res[j] = '\0';
return res;
}
int main()
{
//对100/0/-100进行测试
char* p = myitoa(100);
char* q = myitoa(0);
char* m = myitoa(-100);
//cout的<<重载:遇到字符型指针会当作字符串名来处理,输出指针所指的字符串
cout << p << endl << q << endl << m << endl;
return 0;
}
结果: