程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> 數字轉換成指定進制的數字字符串

數字轉換成指定進制的數字字符串

編輯:關於C

下面的函數將一個long型的整數轉換為某個指定進制的數字字符串。
正數和0的前面輸出'+'號,負數的前面輸出'-'號。
如果指定8進制字符串則以'0'開頭;如果指定16進制,則以'0x'
或'0X'開頭。
可以指定類似16進制的數輸出字母的大小寫。

編譯:
    g++ -g -W -Wall -Wextra -o mytest main.cpp
執行:
    ./mytest

main.cpp:
==================================
// 2011年 11月 14日 星期一 09:46:47 CST
// author: 李小丹(Li Shao Dan) 字 殊恆(shuheng)
// K.I.S.S
// S.P.O.T

#include <iostream>

using namespace std;

#define LOW_CASE_NUM 0
#define UP_CASE_NUM 1

#define MAX_STR_SIZE 128

char *num_to_str(long, int, int, char *, size_t);

int main()
{
    char buf[MAX_STR_SIZE];
    char *p;
    // 輸出:16進制, 並使用小寫;
    if((p = num_to_str(333, 16, LOW_CASE_NUM, buf, sizeof(buf))))
        cout << p << endl;
    // 輸出:16進制, 並使用大寫;
    if((p = num_to_str(-333, 16, UP_CASE_NUM, buf, sizeof(buf))))
        cout << p << endl;
    // 輸出:8進制
    if((p = num_to_str(333, 8, LOW_CASE_NUM, buf, sizeof(buf))))
        cout << p << endl;
    // 輸出:2進制
    if((p = num_to_str(-333, 2, LOW_CASE_NUM, buf, sizeof(buf))))
        cout << p << endl;
    // 輸出:10進制
    if((p = num_to_str(-333, 10, LOW_CASE_NUM, buf, sizeof(buf))))
        cout << p << endl;
    return 0;
}

inline static long num_div(long &c, int b)
{
    long r = c % b;
    c /= b;
    return r;
}


char *num_to_str(long num, int base, int cs, char *buf, size_t s)
{
    if(base < 2 || base > 36)
        return 0;

    const char *ln = "0123456789abcdefghijklmnopqrstuvwxyz";
    const char *un = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    const char *n = cs ? ln : un;
    char sg = num < 0 ? (num = -num, '-') : '+';
    char tmp[MAX_STR_SIZE];
    int i = 0;

    tmp[i++] = 0;
    if(!num)
        tmp[i++] =  '0';
    else
        while(num) tmp[i++] = n[num_div(num, base)];

    switch(base) {
    case 16:
        tmp[i++] = n[33];
    case 8:
        tmp[i++] = '0';
        break;
    }
    tmp[i] = sg;

    if(i > (int)s) return 0;
    for(int j = 0; i >= 0; ++j, --i)
        buf[j] = tmp[i];
    return buf;
}


摘自 leeshuheng的專欄
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved