開始自己寫的時候隻是一個簡單的實作,沒有考慮到前面可能有空格和正負号的問題,很不周全,之後進行了修正,同時補做了itoa,這個需要注意的就是正負号還有逆序,實作如下。
其中要注意的技巧就是在求10的n次方時候的方法,不用單獨寫函數就可以實作;另外還有近期寫代碼時候用到的求n除以m的q次方時候的處理技巧。
#include <iostream>
#include <vector>
using namespace std;
int my_atoi(const char* str){
int res=0;
char sign='+';
const char *pStr=str;
//去空格
while (*pStr==' ')
pStr++;
//判斷正負
if(*pStr=='+' || *pStr=='-')
sign=*pStr++;
//計算絕對值
while (*pStr>='0' && *pStr<='9')
{
res=res*10+*pStr-'0';
pStr++;
}
return sign=='-'?-res:res;
}
//最快的字元串倒置方法
void rever(char s[]){
int len=strlen(s);
int i=0;
int j=len-1;
char c;
while (i<j)
{
c=s[i];
s[i]=s[j];
s[j]=c;
i++;
j--;
}
}
void my_itoa(int n, char s[]){
int i=0;
int sign=0;
//判斷符号
if((sign=n)<0)
n=-n;
//分解生成逆序字元串
do {
s[i++]=n%10+'0';
} while ((n/=10)>0);
if(sign<0)
s[i++]='-';
//結尾注意添加\0
s[i]='\0';
rever(s);
}
int main()
{
cout << "**************test for my_atoi*********************" << endl;
char *str="123456ad";
printf("%d\n",my_atoi(str));
str=" 123456dd45";
printf("%d\n",my_atoi(str));
str=" -12345dd545";
printf("%d\n",my_atoi(str));
cout << "**************test for my_itoa*********************" << endl;
int n=123;
char str1[]="0000";
my_itoa(n,str1);
printf("%s\n",str1);
n=-456;
my_itoa(n,str1);
printf("%s\n",str1);
return 0;
}