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的實作方式就是這樣,如果看到也請多提意見,筆誤也請提出來。