参数与指针课后动动手
题目:0. 你应该听说过 itoa 函数(函数文档 -> 传送门),它的作用是将一个整数转换成字符串形式存储。现在要求我们自己来实现一个类似功能的函数 myitoa(int num, char *str),该函数的第一个参数是待转换的整型变量,第二参数传入一个字符指针,用于存放转换后的字符串答案代码如下:
#include <stdio.h>
char *myitoa(int num, char *str);
char *myitoa(int num, char *str)
{
int dec = 1;
int i = 0;
int temp;
if (num < 0)
{
str = '-';
num = -num;
}
temp = num;
while (temp > 9)
{
dec *= 10;
temp /= 10;
}
while (dec != 0)
{
str = num / dec + '0';
num = num % dec;
dec /= 10;
}
str = '\0';
return str;
}
int main(void)
{
char str;
printf("%s\n", myitoa(520, str));
printf("%s\n", myitoa(-1234, str));
return 0;
}
能否详细解释一下函数体内每一行的功能作用呢?谢谢 1. 第一行:声明函数 myitoa,该函数返回一个 char 类型的指针,参数为一个 int 类型的 num 和一个 char 类型的指针 str。
2. 第二行:函数的实现部分,返回一个 char 类型的指针。
3. 第三行:定义一个 int 类型的变量 dec,并初始化为 1。
4. 第四行:定义一个 int 类型的变量 i,并初始化为 0。
5. 第五行:定义一个 int 类型的变量 temp,并将 num 的值赋值给它。
6. 第七行:如果 num 小于 0,则将负号 '-' 存入 str 中,并将 num 取反。
7. 第十行:while 循环,计算出 num 的位数,将结果存入 dec 中。
8. 第十三行:while 循环,将 num 转换成字符串存入 str 中。
9. 第十四行:将 num 的最高位转换成字符存入 str 中。
10. 第十五行:将 num 取模后的结果赋值给 num。
11. 第十六行:将 dec 除以 10。
12. 第十七行:将 i 加 1。
13. 第十九行:将字符串的结束符 '\0' 存入 str 中。
14. 第二十一行:函数结束,返回 str。
15. 第二十五行:定义一个 char 类型的数组 str,长度为 10。
16. 第二十七行:调用 myitoa 函数,将 520 转换成字符串并存入 str 中,然后将 str 打印出来。
17. 第二十八行:调用 myitoa 函数,将 -1234 转换成字符串并存入 str 中,然后将 str 打印出来。
总体来说,该函数的作用是将一个整数转换成字符串形式,并存储到一个字符数组中。函数的实现主要是通过计算整数的位数,然后逐位将整数转换成字符,最终得到一个字符串。 isdkz 发表于 2023-9-18 19:33
1. 第一行:声明函数 myitoa,该函数返回一个 char 类型的指针,参数为一个 int 类型的 num 和一个 char 类 ...
你好,我还有几个问题需要追问一下,谢谢
1.刚开始为什么要int dec = 1; int i = 0;
2. while (temp > 9),为什么while里面的条件是temp>9? temp>9代表什么?
3.dec *= 10;temp /= 10;他们分别代表dec乘以10之后赋值给dec,temp除以10之后赋值给temp,有什么作用?
4. str = num / dec + '0';这 num / dec 为什么num要除以dec?
5. num = num % dec; 这num为什么要被dec取余数
6.dec /= 10;这里dec除以10之后再被赋值给dec,是因为什么?
我的追问到此结束,谢谢你的回答{:7_112:}
拿-1234为例
因为-1234<0,所以进入条件语句if,str=str=‘-’(这里的'-'已经是char型了),temp=num=-num=1234(转换完符号后,继续转换数字,这里的1234还是int类型);
然后进入第一个while循环:
第一次循环:temp=1234>9;dec=10;temp=123;
第二次循环:temp=123>9;dec=100;temp=12;
第三次循环:temp=12>9;dec=1000;temp=1;
(因为整型是十进制逢十进1,可以理解为不论是在哪个位上从0-9就是一个周期,所以循环条件是temp>9;循环语句是:dec*=10,temp/=10,这里的dec计算是为了在第二个循环中方便将十进制的每一位数字逐步转换成char型字符“1 2 3 4 5 6 7 8 9 0”,temp是为了结束循环)
再之后进入第二个循环:
第一次:dec!=0;str=1234/1000+‘0'=(1+48)(因为int占四个byte而char占1个byte,所以“=”右边进行十进制运算,这里是十进制相加得49,又因为str是char型指针,最后str存储的是char型的1);
num=1234%1000=234;dec=100
第二次:dec!=0;str=234/100+‘0'=(2+48)(这里是十进制相加得50即为char型的2);
num=234%100=34;dec=10
第三次:dec!=0;str=34/10+‘0'=(3+48)(这里是十进制相加得51即为char型的3);
num=34%10=4;dec=1
第四次:dec!=0;str=4/1+‘0'=(4+48)(这里是十进制相加得52即为char型的4);
num=4%1=0;dec=0
循环结束
str=str='\0';(这里是因为一个字符串的存储以'\0'结束)
最后的return str 最后返回char型指针str
www^^ 发表于 2023-9-19 21:04
拿-1234为例
因为-12349;dec=10;temp=123;
第二次循环:temp=123>9;dec=100;temp=12;
这里的''="就是数学意义上的等号,不是赋值的意思。如果有错误,望指正,谢谢。
页:
[1]