鱼C论坛

 找回密码
 立即注册
查看: 536|回复: 5

[已解决]C语言 参数和指针课后题

[复制链接]
发表于 2024-3-26 15:41:12 | 显示全部楼层 |阅读模式

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

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

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


由于小甲鱼也没有给代码注释,@FishC你能给讲解下吗?
最佳答案
2024-3-26 15:41:27
当我们调用myitoa函数时,我们需要传入一个整型变量num和一个字符指针str。

函数内部首先判断num的值是否小于0,如果小于0,则表示num是一个负数,需要在字符串起始位置加上负号,并将num取反。然后,我们将num的值保存到临时变量temp中。

接下来,我们使用循环来确定num有多少位数,通过不断地将dec乘以10,然后将temp除以10,直到temp小于等于9为止。

然后,我们使用另一个循环来实现数字转换为字符串的过程。我们通过不断地将num除以dec得到当前位上的数字,并将其加上字符'0'转换成对应的字符,然后将字符保存到str指针指向的位置。接着,我们更新num的值为num除以dec的余数,并将dec除以10,以便处理下一位。重复此过程直到dec等于0。

最后,我们将字符串的结尾设置为'\0',表示字符串结束。

最后,在main函数中,我们声明一个字符变量str,然后调用myitoa函数并将结果打印出来。

然而,这个代码存在一些问题:
1. 函数的返回类型应该是char*而不是char。
2. 在处理负数时,我们应该将负号存储在字符指针指向的位置而不是直接赋值给指针变量本身。
3. 在main函数中,我们声明的字符变量str应该是一个字符数组,而不是一个字符变量。

下面是修复了问题的代码:
#include <stdio.h>

char* myitoa(int num, char* str)
{
    int dec = 1;
    int i = 0;
    int temp;

    if (num < 0)
    {
        *str = '-';
        str++;
        num = -num;
    }

    temp = num;

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

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

    *str = '\0';

    return str;
}

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

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

    return 0;
}

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-3-26 15:41:27 | 显示全部楼层    本楼为最佳答案   
当我们调用myitoa函数时,我们需要传入一个整型变量num和一个字符指针str。

函数内部首先判断num的值是否小于0,如果小于0,则表示num是一个负数,需要在字符串起始位置加上负号,并将num取反。然后,我们将num的值保存到临时变量temp中。

接下来,我们使用循环来确定num有多少位数,通过不断地将dec乘以10,然后将temp除以10,直到temp小于等于9为止。

然后,我们使用另一个循环来实现数字转换为字符串的过程。我们通过不断地将num除以dec得到当前位上的数字,并将其加上字符'0'转换成对应的字符,然后将字符保存到str指针指向的位置。接着,我们更新num的值为num除以dec的余数,并将dec除以10,以便处理下一位。重复此过程直到dec等于0。

最后,我们将字符串的结尾设置为'\0',表示字符串结束。

最后,在main函数中,我们声明一个字符变量str,然后调用myitoa函数并将结果打印出来。

然而,这个代码存在一些问题:
1. 函数的返回类型应该是char*而不是char。
2. 在处理负数时,我们应该将负号存储在字符指针指向的位置而不是直接赋值给指针变量本身。
3. 在main函数中,我们声明的字符变量str应该是一个字符数组,而不是一个字符变量。

下面是修复了问题的代码:
#include <stdio.h>

char* myitoa(int num, char* str)
{
    int dec = 1;
    int i = 0;
    int temp;

    if (num < 0)
    {
        *str = '-';
        str++;
        num = -num;
    }

    temp = num;

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

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

    *str = '\0';

    return str;
}

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

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

    return 0;
}

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-26 15:43:05 | 显示全部楼层
FishC 发表于 2024-3-26 15:41
当我们调用myitoa函数时,我们需要传入一个整型变量num和一个字符指针str。

函数内部首先判断num的值是 ...

为什么要给字符串起始位置加上负号?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-26 15:43:12 | 显示全部楼层
liyifeng295641 发表于 2024-03-26 15:43
为什么要给字符串起始位置加上负号?


在处理负数转换时,我们需要在字符串起始位置加上负号是为了表示这个数是负数。例如,如果我们要将-1234这个负数转换成字符串,最终得到的字符串应该是"-1234"。所以,在判断num小于0后,我们先将负号赋值给字符指针指向的位置,然后将num取反,这样就能保证转换后的字符串以负号开头。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-26 15:45:32 | 显示全部楼层
FishC 发表于 2024-3-26 15:43
在处理负数转换时,我们需要在字符串起始位置加上负号是为了表示这个数是负数。例如,如果我们要将-123 ...

好的,我理解了一点代码了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-26 15:45:37 | 显示全部楼层
liyifeng295641 发表于 2024-03-26 15:45
好的,我理解了一点代码了。


太好了,我很高兴你对代码有所理解。如果还有其他问题,可以随时问我。编程学习中遇到问题是很正常的,不要气馁,继续坚持学习,你会越来越擅长编程的!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 13:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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