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的实现方式就是这样,如果看到也请多提意见,笔误也请提出来。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIwczX0xiRGZkRGZ0Xy9GbvNGL2EzXlpXazxSP9cnW1Z1RhZDZtJGaoJTW04kMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZwpmLzYDO5IjNxQTM2EDOwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)