天天看點

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的實作(字元串轉數字和數字轉字元串)

繼續閱讀