鱼C论坛

 找回密码
 立即注册
查看: 1276|回复: 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';

这个是我写的】
/******************************************************************************

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

*******************************************************************************/

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

char myitoa(int num, char *str);

char myitoa(int num, char *str)
{
        int i = 0;
        int j = 0;
        int len;
        int temp;
        
        if(num < 0)
        {
                str[i++] = '-';
                num = -num;
        }
        
        do 
        {
                temp = (int) pow(10,++j);
        }
        while(temp < num);
        
        len = j -1;
        while( pow(10,len) != 1)
        {
                str[i++] = num / (int)(pow(10,len)) + '0';
                num = num % (int)(pow(10,len));
                len = len -1;
                if( len == 0)
                {
                        str[i++] = num;
                }
        }
        
        str[i] = '\0';
        return str;
        
}
int main()
{
        char str[10];
        printf("%s\n",myitoa(520, str));
        //printf("%s\n",myitoa(-1234, str));
        
        return 0;
}



这个是甲鱼的
#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;
}
最佳答案
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 *吧
想知道小甲鱼最近在做啥?请访问 -> 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 *吧
想知道小甲鱼最近在做啥?请访问 -> 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、先自己去研究一下,实在弄不懂的话再来问,如果搞懂了,把自己的思路附在自己的问题下面,方便后来的鱼友
想知道小甲鱼最近在做啥?请访问 -> 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的代码是我自己写的
想知道小甲鱼最近在做啥?请访问 -> 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]);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-14 00:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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