检索词:
进制转换、通用进制转换、二进制转十进制、二进制转八进制、二进制转十六进制、
十进制转二进制、十六进制转二进制、八进制转二进制、通用算法、字符型输入输出
一、英文先行
-
英文 中文 缩写 标识符 Binary 二进制 Bin/B Octal 八进制 OCT/O %o—(无符号8进制整数(不输出前缀0)) Decimal 十进制 DEC/D %u—(无符号10进制整数) AND %d—(整数/有符号) hexadecimal 十六进制 HEX/H %x/X—(无符号,x对应小写,X对应大写(不输出前缀0x)) system 进制 conversion 转换 malloc 分配内存
二、自定义函数—SystemConversion()
-
输入参数说明
函数输入 数据类型 含义 in char* 源数据 s_in int 源数据的进制 s_out int 目标数据的进制 -
内部定义参数说明
变量名称 参数类型 参数含 n int 临时循环量 out char* 用于保存目标数据 dec int 转换时的中间值 outLength int ★目标数据的长度(自行尝试不同取值,影响输出结果) -
返回值说明
函数返回值类型 返回值含义 char* 转换后的结果 -
源代码
#include <stdio.h> #include <string.h> #include<cstdlib> char* SystemConversion(char *in,int s_in,int s_out) { char *out=(char*)malloc(sizeof(char)); int n,dec=0; int outLength=512; for(char *p=in;*p;p++) dec=dec*s_in+(*p-((*p>='a')?('a'-10):'0')); for(n=outLength-1;dec&&n;dec=dec/s_out) out[n--]=(dec%s_out)+(((dec%s_out)<10)?'0':('a'-10)); memmove(out,out+n+1,outLength-n-1); out[outLength-n-1]=0; return out; } int main() { for(int i=2;i<=36;i++) printf("转换为%d进制结果:%s\n",i,SystemConversion("1024",10,i)); return 0; }
-
【运行结果】
四、库函数—itoa()
-
itoa()函数介绍
**char itoa( int value, char string,int radix);
参数说明:
value:欲转换的数据。
string:目标字符串的地址。
radix:转换后的进制数,可以是10进制、16进制等,范围必须在 2-36。功能:
将整数value 转换成字符串存入string 指向的内存空间 ,radix 为转换时所用基数(保存到字符串中的数据的进制基数)。
返回值:
函数返回一个指向 str,无错误返回。
-
itoa()函数实例:
#include <stdio.h> #include<stdlib.h> int main() { char a[100]={0}; for(int i=2;i<=36;i++) { itoa(1024,a,i); printf("转换为%d进制结果:%s\n",i,a); } return 0; }
-
【运行结果】
五、需求拓展
-
类型转换
源类型 目标类型 转换方法 int char 0+‘0’ char* string string s; char* p =“hello”; s = p;直接赋值 char int ‘0’-‘0’ string char* char ch[20]; string s=“123456”; strcpy(ch,s.c_str()); -
C语言 单引号和双引号的区别
-
含义不同
用单引号引起的一个字符实际上代表一个整数,整数值对应于该字符在编译器采用的字符集中的序列值。而一般我们的编译器采用的都是ASCII字符集。因此’s’的含义其实和十进制数115的含义是一致的。而用双引号引起的字符串,代表的是一个指向无名数组起始字符的指针。
-
大小不同
用单引号引起的一个字符大小就是一个字节。而用双引号引起的字符串大小是字符的总大小+1,因为用双引号引起的字符串会在字符串末尾添加一个二进制为0的字符’\0’。
-
六、分析
-
自定义函数
- 优点:
- 大部分转换算法都可满足
- 易于直接使用
- 可用于学习思考
- 缺点:
- 无输入异常反馈机制(即无法判断源数据是否满足源数据的进制),需要自己实现
- 因该算法为进制转换通用算法,相对某种具体转换为非最优解
- 优点:
-
库函数
调个库,一行解决不方便吗?
-
二者时间消耗几乎一致