鱼C论坛

 找回密码
 立即注册
查看: 1265|回复: 4

[已解决]参数与指针课后动动手

[复制链接]
发表于 2023-9-18 19:33:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目: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[i++] = '-';
                num = -num;
        }

        temp = num;

        while (temp > 9)
        {
                dec *= 10;
                temp /= 10;
        }

        while (dec != 0)
        {
                str[i++] = num / dec + '0';
                num = num % dec;
                dec /= 10;
        }

        str[i] = '\0';

        return str;
}

int main(void)
{
        char str[10];

        printf("%s\n", myitoa(520, str));
        printf("%s\n", myitoa(-1234, str));

        return 0;
}

能否详细解释一下函数体内每一行的功能作用呢?谢谢
最佳答案
2023-9-19 21:04:54
拿-1234为例
因为-1234<0,所以进入条件语句if,str[i++]=str[1]=‘-’(这里的'-'已经是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[2]=1234/1000+‘0'=(1+48)(因为int占四个byte而char占1个byte,所以“=”右边进行十进制运算,这里是十进制相加得49,又因为str是char型指针,最后str[2]存储的是char型的1);
             num=1234%1000=234;dec=100
第二次:dec!=0;str[3]=234/100+‘0'=(2+48)(这里是十进制相加得50即为char型的2);
             num=234%100=34;dec=10
第三次:dec!=0;str[4]=34/10+‘0'=(3+48)(这里是十进制相加得51即为char型的3);
             num=34%10=4;dec=1
第四次:dec!=0;str[5]=4/1+‘0'=(4+48)(这里是十进制相加得52即为char型的4);
             num=4%1=0;dec=0
循环结束
str[i]=str[6]='\0';(这里是因为一个字符串的存储以'\0'结束)
最后的return str 最后返回char型指针str
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

总体来说,该函数的作用是将一个整数转换成字符串形式,并存储到一个字符数组中。函数的实现主要是通过计算整数的位数,然后逐位将整数转换成字符,最终得到一个字符串。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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[i++] = num / dec + '0';  这 num / dec 为什么num要除以dec?
5. num = num % dec; 这num为什么要被dec取余数
6.  dec /= 10;这里dec除以10之后再被赋值给dec,是因为什么?

我的追问到此结束,谢谢你的回答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-19 21:04:54 | 显示全部楼层    本楼为最佳答案   
拿-1234为例
因为-1234<0,所以进入条件语句if,str[i++]=str[1]=‘-’(这里的'-'已经是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[2]=1234/1000+‘0'=(1+48)(因为int占四个byte而char占1个byte,所以“=”右边进行十进制运算,这里是十进制相加得49,又因为str是char型指针,最后str[2]存储的是char型的1);
             num=1234%1000=234;dec=100
第二次:dec!=0;str[3]=234/100+‘0'=(2+48)(这里是十进制相加得50即为char型的2);
             num=234%100=34;dec=10
第三次:dec!=0;str[4]=34/10+‘0'=(3+48)(这里是十进制相加得51即为char型的3);
             num=34%10=4;dec=1
第四次:dec!=0;str[5]=4/1+‘0'=(4+48)(这里是十进制相加得52即为char型的4);
             num=4%1=0;dec=0
循环结束
str[i]=str[6]='\0';(这里是因为一个字符串的存储以'\0'结束)
最后的return str 最后返回char型指针str
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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;

这里的''="就是数学意义上的等号,不是赋值的意思。如果有错误,望指正,谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-6 04:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表