鱼C论坛

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

[已解决]S1E29 关于while里面

[复制链接]
发表于 2020-5-6 18:43:30 | 显示全部楼层 |阅读模式
5鱼币
本帖最后由 Justin1 于 2020-5-6 18:44 编辑

这是这个题目

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

我自己写了一套代码,模仿甲鱼的,感觉实际上意思差不多,但是我的第二个while循环出了问题。

小甲鱼的代码这两句句的
+'0'不大理解  str[i++] = num / (int)(pow(10,len)) + '0';
str[i] = '\0';

这个是我写的】

  1. /******************************************************************************

  2.                             Online C Compiler.
  3.                 Code, Compile, Run and Debug C program online.
  4. Write your code in this editor and press "Run" button to compile and execute it.

  5. *******************************************************************************/

  6. #include <stdio.h>
  7. #include <math.h>

  8. char myitoa(int num, char *str);

  9. char myitoa(int num, char *str)
  10. {
  11.         int i = 0;
  12.         int j = 0;
  13.         int len;
  14.         int temp;
  15.        
  16.         if(num < 0)
  17.         {
  18.                 str[i++] = '-';
  19.                 num = -num;
  20.         }
  21.        
  22.         do
  23.         {
  24.                 temp = (int) pow(10,++j);
  25.         }
  26.         while(temp < num);
  27.        
  28.         len = j -1;
  29.         while( pow(10,len) != 1)
  30.         {
  31.                 str[i++] = num / (int)(pow(10,len)) + '0';
  32.                 num = num % (int)(pow(10,len));
  33.                 len = len -1;
  34.                 if( len == 0)
  35.                 {
  36.                         str[i++] = num;
  37.                 }
  38.         }
  39.        
  40.         str[i] = '\0';
  41.         return str;
  42.        
  43. }
  44. int main()
  45. {
  46.         char str[10];
  47.         printf("%s\n",myitoa(520, str));
  48.         //printf("%s\n",myitoa(-1234, str));
  49.        
  50.         return 0;
  51. }
复制代码




这个是甲鱼的

  1. #include <stdio.h>

  2. char *myitoa(int num, char *str);

  3. char *myitoa(int num, char *str)
  4. {
  5.         int dec = 1;
  6.         int i = 0;
  7.         int temp;

  8.         if (num < 0)
  9.         {
  10.                 str[i++] = '-';
  11.                 num = -num;
  12.         }

  13.         temp = num;

  14.         while (temp > 9)
  15.         {
  16.                 dec *= 10;
  17.                 temp /= 10;
  18.         }

  19.         while (dec != 0)
  20.         {
  21.                 str[i++] = num / dec + '0';
  22.                 num = num % dec;
  23.                 dec /= 10;
  24.         }

  25.         str[i] = '\0';

  26.         return str;
  27. }

  28. int main(void)
  29. {
  30.         char str[10];

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

  33.         return 0;
  34. }
复制代码
最佳答案
2020-5-6 18:43:31
if( len == 0)
{
    str[i++] = num + '0';   //这行添加 + '0'
}
+'0'的作用是将数字转换为对应的ASCII码,比如某一位的数字是5,将这个整数的5加上'0'的ASCII码48得到53,就是'5'的ASCII码。
str[ i ] = '\0';是给得到的字符串添加一个结束标志。

另外,你的 char myitoa(int num, char *str),返回值应该是char *吧

最佳答案

查看完整内容

if( len == 0) { str = num + '0'; //这行添加 + '0' } +'0'的作用是将数字转换为对应的ASCII码,比如某一位的数字是5,将这个整数的5加上'0'的ASCII码48得到53,就是'5'的ASCII码。 str[ i ] = '\0';是给得到的字符串添加一个结束标志。 另外,你的 char myitoa(int num, char *str),返回值应该是char *吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-5-6 18:43:31 | 显示全部楼层    本楼为最佳答案   
if( len == 0)
{
    str[i++] = num + '0';   //这行添加 + '0'
}
+'0'的作用是将数字转换为对应的ASCII码,比如某一位的数字是5,将这个整数的5加上'0'的ASCII码48得到53,就是'5'的ASCII码。
str[ i ] = '\0';是给得到的字符串添加一个结束标志。

另外,你的 char myitoa(int num, char *str),返回值应该是char *吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-5-7 06:20:55 | 显示全部楼层
本帖最后由 Neverturnback 于 2020-5-7 06:22 编辑

1、关于+‘0’可以看看ascii码表就知道了,这个作用是快捷的将0~9数字转换成对应字母。
2、(int)(pow(10,len))其中pow()是一个系统函数,可以百度一下看看这个函数的作用,然后前面的(int)是因为pow的出来的数据不是一个int型,所以将pow返回的数据强制转换成int型,可以百度或者CSDN搜搜关于强制转换这方面的知识和注意点
3、num/pow(10,len),首先pow(10,len)返回的数肯定是1,10,100,1000。。。这样的数,所以用num除以这些数能得到什么?假如123/100 = ?(注意这里的除法和两个除数的数据类型,这也是为什么要把pow的数据类型强转为int型的原因,不会的话,可以百度这方面的知识)
4、  str[i++] = num / (int)(pow(10,len)) + '0';中i++这个理解是什么意思了么?是先计算,然后i+1,还是先将i+1再计算?这里面的len是什么作用?搞懂后结合前后你就知道这一整句是什么意思了
5、str[i] = '\0';这里面 i 的值是多少?如果不知道,查查关于变量作用域方面的知识,至于后面为什么赋值‘\0’查查关于字符串的知识,就能弄懂了
6、先自己去研究一下,实在弄不懂的话再来问,如果搞懂了,把自己的思路附在自己的问题下面,方便后来的鱼友
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-7 18:23:13 | 显示全部楼层
Neverturnback 发表于 2020-5-7 06:20
1、关于+‘0’可以看看ascii码表就知道了,这个作用是快捷的将0~9数字转换成对应字母。
2、(int)(pow(10,l ...

谢谢回答了,我找到了我的问题。我的问题表述没写清楚,造成了一定误会,234的代码是我自己写的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-7 21:44:24 | 显示全部楼层
superbe 发表于 2020-5-6 18:43
if( len == 0)
{
    str = num + '0';   //这行添加 + '0'

这里我又有点懵了, 为什么定义函数的时候 是 char *myitoa(int, char *str)呢? 对于*myitoa不大理解。
另外对于这个语句         
str[i++] = num / (int)(pow(10,len)) + '0';
我不知道该如何看每一次str[i]的值,我的理解是这样的,但是打印结果为NULL
printf("str[i]: %c\n", str[i]);
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-1 18:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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