C程序设计语言 3-5

练习 3-5 编写函数 itob(n, s, b),将整数 n 转换为以 b 为底的数,并将转换结果以字符的形式保存到字符串 s 中。例如,itob(n, s, 16)把整数 n 格式化成十六进制整数保存在 s 中。

一开始想的是设置一个进制转换表,比如16进制得到[0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f],进制得到[0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o]等等,每得到一个模数之后便直接从里面根据下标取值放入新的字符串。编完之后看了其他人的程序觉得没必要这么复杂。可以借鉴以下博主的程序:

https://blog.csdn.net/qq_33685612/article/details/78949883?ops_request_misc=&request_id=&biz_id=102&utm_source=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1

但是可以在他的程序之上增加一段进制检查的代码,防止输入进制数过大或过小。

#include <stdio.h>
#include <string.h>

#define MAXLEN 32

void itob(int n, char s[], int b);
void reverse(char s[]);

int main()
{
	int n, b;
	char s[MAXLEN];		//2进制长度最大
	
	printf("Please input digit n, and system b:\n");
	scanf("%d, %d", &n, &b);
	itob(n, s, b);
	
	return 0;
}

void itob(int n, char s[], int b)
{
	int i, sign, k;
	char t[b+1];
	
	if (b < 37 && b > 0)        //英文字母有26个,所以设置了最大36进制
		;
	else 
	{
		printf("illegal\n");
		return;
	}		//进制检查
	
	sign = n;
	for (i = 0; i <= b; i++)
	{
		if (i <= 10)
			s[i] = '0' + i - 1;
		else s[i] = 'a' + i - 11;
	}		//创建进制转换表
	s[i++] = '\0';
	
	i = 0;
	do {
		if (sign < 0)
		{
			k = -(n % b);
			t[i++] = s[++k];
		}
		else
		{
			k = n % b;
			t[i++] = s[++k];
		}
	} while ((n /= b) > 0);
	
	if (sign < 0)
		t[i++] = '-';
	t[i] = '\0';
	
	reverse(t);        //生成的字符表为逆序排列,需要逆转
	printf("inverted to %d system:%s\n", b, t);
	
	return;
}

void reverse(char s[])
{
	int i, j, c;
	
	for (i = 0, j = strlen(s) - 1; i < j; i++, j--)
	{
		c = s[i];
		s[i] = s[j];
		s[j] = c;
	}

	return;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值