liyifeng295641 发表于 2024-3-26 15:41:12

C语言 参数和指针课后题

0. 你应该听说过 itoa 函数(函数文档 -> 传送门),它的作用是将一个整数转换成字符串形式存储。现在要求我们自己来实现一个类似功能的函数 myitoa(int num, char *str),该函数的第一个参数是待转换的整型变量,第二参数传入一个字符指针,用于存放转换后的字符串。

https://xxx.ilovefishc.com/forum/201701/05/165251rn3c3dcp5pec6nyp.png


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


由于小甲鱼也没有给代码注释,@FishC你能给讲解下吗?

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;

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

    return 0;
}

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

liyifeng295641 发表于 2024-3-26 15:43:05

FishC 发表于 2024-3-26 15:41
当我们调用myitoa函数时,我们需要传入一个整型变量num和一个字符指针str。

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

为什么要给字符串起始位置加上负号?

FishC 发表于 2024-3-26 15:43:12

liyifeng295641 发表于 2024-03-26 15:43
为什么要给字符串起始位置加上负号?

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

liyifeng295641 发表于 2024-3-26 15:45:32

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

好的,我理解了一点代码了。

FishC 发表于 2024-3-26 15:45:37

liyifeng295641 发表于 2024-03-26 15:45
好的,我理解了一点代码了。

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: C语言 参数和指针课后题