天天看点

Myatoi和Myitoa的实现(字符串转数字和数字转字符串)

1.字符串转数字:

理想情况下我们希望的字符串就是“514”或者是“383842389”反正就都是数字,这种情况下怎么来写呢?假如是字符串“514”,正序把他输出变成数字514,定义一个变量,在第一个数字时乘10+加下一个数字以此类推,变量初始值为0,0乘10加5等于5,str++,5在再乘10加1等于51,str++,51乘10加4即514,以此类推。要说明的是:我们还要减去字符零

int Myatoi(const char *str)
{
    int tmp=0;
    while(*str!='\0')
    {
        tmp=tmp*10+*str-'0';
        str++;
    }
    return tmp;
}
int main()
{
    printf("%d\n",Myatoi("514"));
    return 0;
}
           

可事实我们不会总是遇见这种字符串我们还会遇见“ 514”,“51#4”,“-514”等等,那我们就要把考虑的都要加进去了。

#include <stdio.h>
#include <assert.h>
#include <ctype.h>
int Myatoi(const char *str)
{
    assert(str != NULL);
	if(str == NULL)
	{
		return 0;
	}
    while(*str==' ')                            11
    {
        str++;
    }
    int flg=1;
    if(*str=='-')
    {
        flg=-1;
        str++;
    }
    else if(*str=='+')
    {
        str++;
    }
    int tmp=0;
    //while(*str!='\0')
    while(isdigit(*str))
    {
        tmp=tmp*10+*str-'0';
        str++;
    }
    return flg*tmp;
}
int main()
{
    printf("%d\n",Myatoi("   -51#4"));
    return 0;
}
           

注意:①加进去了断言加了头文件如果这个字符串是空的那直接return0;②遇到非数字的其他字符则提前结束,用到了判断是否为数字的函数,加进去了头文件;③注意第11行,自己在写的时候不小心写成了if而非while这就导致如果出现一个以上的空格那么就出不来正确答案。逻辑应该是只要有空格那就str++并非if,一定要注意!!④定义了变量flg,在Myatoi函数中return时一定返回的的要加上符号,要给tmp乘flg,决定最后出来的数字时是正。

2.数字转字符串

我们前面有内容不就说了各种对数字的处理,有数字的逆序输出,有数字的个数确定,有数字的正序输出…其中我们知道对一个数字从先%除在/除便是从个位开始依次输出它了,这样出来的数字是逆序。若想正序输出的话还要根据数字的位数再确定除以10的几次方,不免比逆序的麻烦了很多。但我们前面知道了数据的反转并不复杂。那我们就中间转折一下来解决问题。(已加测试用例)

将数字转换成字符串并保存在buf中

void Myitoa(char *buf,int n)
{
    int i=0;
    while(n!=0)
    {
        buf[i]=n%10+'0';
        n/=10;
        i++;
    }
    buf[i]='\0';
    //逆序
    char tmp;
    i--;                             //逆序时不需要加上结尾的'\0'
    for(int j=0;j<i;j++,i--)
    {
        tmp=buf[i];
        buf[i]=buf[j];
        buf[j]=tmp;
    }
}
int main()
{
    char str[100];
    Myitoa(str,76789);
    printf("%s\n",str);
    return 0;
}
           

Myatoi和Myitoa的实现方式就是这样,如果看到也请多提意见,笔误也请提出来。

Myatoi和Myitoa的实现(字符串转数字和数字转字符串)

继续阅读