提供 任意進制 轉 10 進制 ToDec()
與 10 進制轉任意進制 DecTo()
至於要 x 進制數字直接換成 y 進制數字
如果您知道方法的話, 請您不吝提供

任意進制轉10進制中, 有簡單的錯誤偵測,
但均假設輸入為正號, 且第一個字元不可以為'+'
若測到輸入有誤, 反回為1,將 dec 設為 -1

十進制轉任意進制,將結果存於在 char array 中.

事實上 C 裡面
(1)  atof, atoi, atol (字串轉浮點數,整數)
(2)  strtod,strtol,strtoul (字串轉浮點數,整數)
(3)  gcvt, ecvt,fcvt (double 轉字串)
(4)  itoa, ltoa,  (整數轉字串)

已提供不錯的功能
這個練習純粹是作業文, 原始碼參考..

 

// ============================================
// filename : sCovert.cpp
// author   : edison.shih.
// date     : 2010.10.21
// complier : vc2008
//
// all rights reverse
// ============================================

#include <stdio.h>
#include <string.h>
// ============================================
//************************************
// Method:    ToDec, 任意進制轉十進制
// Parameter: const char * Src
// Parameter: int base, 原進制
// Parameter: int * Dec, 轉換後之十進制
//************************************
int ToDec(const char *Src, int base, int *Dec)
{
        int len = strlen(Src)-1;
        int mul = 1;
        int tmp;
        for(; len>=0; --len){
                if(Src[len]>='0' && Src[len]<='9'){
                        tmp = (Src[len]-'0');
                        if(tmp >= base) {
                                *Dec = -1;
                                return 0; // fail.
                        }
                        *Dec = *Dec + mul*tmp;
                }
                else if(Src[len]>='a' && Src[len]<='z'){
                        tmp = (Src[len]-'a'+10);
                        if(tmp >= base)  {
                                *Dec = -1;
                                return 0; // fail.
                        }
                        *Dec = *Dec + mul*tmp;
                }
                else if(Src[len]>='A' && Src[len]<='Z'){
                        tmp = (Src[len]-'A'+10);
                        if(tmp >= base)  {
                                *Dec = -1;
                                return 0; // fail.
                        }
                        *Dec = *Dec + mul*tmp;
                }
                else return 0; // fail.
                mul*=base;
        }
        return 1;
}
// ============================================
void DecTo(int Dec, const int base, char *String)
{
        int len = 0;
        int tmp = 0;
        while(Dec!=0){
                tmp = Dec % base;
                if(tmp>=10) String[len] = 'A' + tmp - 10;
                else String[len] = '0' + tmp;
                Dec/=base;
                len++;
        }
        String[len]=0;

        // reverse string
        strrev(String);
}
// ============================================
int main()
{
        char buffer[20] = "EFG";
        char ans[20] = {0};
        int Dec = 0;

        ToDec(buffer, 20, &Dec);
        printf("%d\n", Dec);
        DecTo(Dec, 20, ans);
        printf("%s\n", ans);
        return 0;
}

arrow
arrow
    全站熱搜

    Edison 發表在 痞客邦 留言(0) 人氣()