设为首页 加入收藏

TOP

数字转换成指定进制的数字字符串
2014-11-24 00:40:23 来源: 作者: 【 】 浏览:45
Tags:数字 换成 指定 进制 字符串

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

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的专栏
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言:rsa算法原理 下一篇自旋锁

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: