努力学C的阿通 发表于 2023-9-18 19:33:46

参数与指针课后动动手

题目: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;
}

能否详细解释一下函数体内每一行的功能作用呢?谢谢

isdkz 发表于 2023-9-18 19:33:57

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 打印出来。

总体来说,该函数的作用是将一个整数转换成字符串形式,并存储到一个字符数组中。函数的实现主要是通过计算整数的位数,然后逐位将整数转换成字符,最终得到一个字符串。

努力学C的阿通 发表于 2023-9-19 19:06:49

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

www^^ 发表于 2023-9-19 21:04:54

拿-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:16:54

www^^ 发表于 2023-9-19 21:04
拿-1234为例
因为-12349;dec=10;temp=123;
第二次循环:temp=123>9;dec=100;temp=12;


这里的''="就是数学意义上的等号,不是赋值的意思。如果有错误,望指正,谢谢。
页: [1]
查看完整版本: 参数与指针课后动动手