当前位置: 移动技术网 > IT编程>开发语言>C/C++ > 数字转换成指定进制的数字字符串

数字转换成指定进制的数字字符串

2019年04月19日  | 移动技术网IT编程  | 我要评论

神医江湖行,零点影视网,荆州长途汽车站

下面的函数将一个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_p(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_p(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的专栏

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网