C语言:进制转换器,实现二进制、八进制、十进制、十六进制之间的相互转化

发布时间 2023-06-13 14:44:53作者: 羽小兮
  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4 #include <ctype.h>
  5 
  6 int dec2bin(int n) { // 十进制转二进制
  7     if (n == 0) {
  8         return 0;
  9     } else {
 10         return (n % 2 + 10 * dec2bin(n / 2));
 11     }
 12 }
 13 
 14 int bin2dec(char* s) { // 二进制转十进制
 15     int len = strlen(s);
 16     int ans = 0;
 17     for (int i = 0; i < len; i++) {
 18         if (!isdigit(s[i]) || s[i] < '0' || s[i] > '1') { // 判断是否为二进制数
 19             printf("输入不合法,请输入二进制数\n");
 20             return -1;
 21         }
 22         ans = ans * 2 + s[i] - '0';
 23     }
 24     return ans;
 25 }
 26 
 27 int dec2oct(int n) { // 十进制转八进制
 28     if (n == 0) {
 29         return 0;
 30     } else {
 31         return (n % 8 + 10 * dec2oct(n / 8));
 32     }
 33 }
 34 
 35 int oct2dec(char* s) { // 八进制转十进制
 36     int len = strlen(s);
 37     int ans = 0;
 38     for (int i = 0; i < len; i++) {
 39         if (!isdigit(s[i]) || s[i] < '0' || s[i] > '7') { // 判断是否为八进制数
 40             printf("输入不合法,请输入八进制数\n");
 41             return -1;
 42         }
 43         ans = ans * 8 + s[i] - '0';
 44     }
 45     return ans;
 46 }
 47 
 48 char* dec2hex(int n) { // 十进制转十六进制
 49     char* hex = (char*)malloc(100);
 50     int temp, i = 1, j;
 51     while (n != 0) {
 52         temp = n % 16;
 53         if (temp < 10) {
 54             temp = temp + 48;
 55         } else {
 56             temp = temp + 55;
 57         }
 58         hex[i++] = temp;
 59         n = n / 16;
 60     }
 61     hex[0] = '0';
 62     hex[i] = '\0';
 63     for (j = 1; j <= i / 2; j++) { // 倒序输出十六进制数
 64         temp = hex[j];
 65         hex[j] = hex[i - j];
 66         hex[i - j] = temp;
 67     }
 68     return hex;
 69 }
 70 
 71 int hex2dec(char* s) { // 十六进制转十进制
 72     int len = strlen(s);
 73     int ans = 0;
 74     for (int i = 0; i < len; i++) {
 75         if (!isalnum(s[i])) { // 判断是否为十六进制数
 76             printf("输入不合法,请输入十六进制数\n");
 77             return -1;
 78         }
 79         if (isdigit(s[i])) {
 80             ans = ans * 16 + s[i] - '0';
 81         } else {
 82             ans = ans * 16 + s[i] - 'A' + 10;
 83         }
 84     }
 85     return ans;
 86 }
 87 
 88 int bin2oct(char* s) { // 二进制转八进制
 89     int n = bin2dec(s);
 90     if (n == -1) {
 91         return -1;
 92     } else {
 93         return dec2oct(n);
 94     }
 95 }
 96 
 97 char* oct2bin(char* s) { // 八进制转二进制
 98     int n = oct2dec(s);
 99     if (n == -1) {
100         return "输入不合法,请输入八进制数\n";
101     } else {
102         return dec2bin(n);
103     }
104 }
105 
106 char* hex2bin(char* s) { // 十六进制转二进制
107     int n = hex2dec(s);
108     if (n == -1) {
109         return "输入不合法,请输入十六进制数\n";
110     } else {
111         return dec2bin(n);
112     }
113 }
114 
115 int main() {
116     while (1) {
117         printf("请输入需要进行的操作:\n");
118         printf("1、十进制转换为二进制\n");
119         printf("2、二进制转换为十进制\n");
120         printf("3、十进制转换为八进制\n");
121         printf("4、八进制转换为十进制\n");
122         printf("5、十进制转换为十六进制\n");
123         printf("6、十六进制转换为十进制\n");
124         printf("7、二进制转换为八进制\n");
125         printf("8、八进制转换为二进制\n");
126         printf("9、十六进制转换为二进制\n");
127         printf("10、退出\n");
128 
129         int opt;
130         scanf("%d", &opt);
131         char num[100];
132         switch (opt) {
133             case 1: // 十进制转二进制
134                 printf("请输入十进制数:\n");
135                 int n1;
136                 scanf("%d", &n1);
137                 printf("%d的二进制表示为:%d\n", n1, dec2bin(n1));
138                 break;
139             case 2: // 二进制转十进制
140                 printf("请输入二进制数(只能包含0和1):\n");
141                 scanf("%s", num);
142                 printf("%s的十进制表示为:%d\n", num, bin2dec(num));
143                 break;
144             case 3: // 十进制转八进制
145                 printf("请输入十进制数:\n");
146                 int n3;
147                 scanf("%d", &n3);
148                 printf("%d的八进制表示为:%d\n", n3, dec2oct(n3));
149                 break;
150             case 4: // 八进制转十进制
151                 printf("请输入八进制数(只能包含0~7):\n");
152                 scanf("%s", num);
153                 printf("%s的十进制表示为:%d\n", num, oct2dec(num));
154                 break;
155             case 5: // 十进制转十六进制
156                 printf("请输入十进制数:\n");
157                 int n5;
158                 scanf("%d", &n5);
159                 printf("%d的十六进制表示为:%s\n", n5, dec2hex(n5));
160                 break;
161             case 6: // 十六进制转十进制
162                 printf("请输入十六进制数:\n");
163                 scanf("%s", num);
164                 printf("%s的十进制表示为:%d\n", num, hex2dec(num));
165                 break;
166             case 7: // 二进制转八进制
167                 printf("请输入二进制数(只能包含0和1):\n");
168                 scanf("%s", num);
169                 printf("%s的八进制表示为:%d\n", num, bin2oct(num));
170                 break;
171             case 8: // 八进制转二进制
172                 printf("请输入八进制数(只能包含0~7):\n");
173                 scanf("%s", num);
174                 printf("%s的二进制表示为:%s\n", num, oct2bin(num));
175                 break;
176             case 9: // 十六进制转二进制
177                 printf("请输入十六进制数:\n");
178                 scanf("%s", num);
179                 printf("%s的二进制表示为:%s\n", num, hex2bin(num));
180                 break;
181             case 10: // 退出
182                 return 0;
183             default:
184                 printf("输入不合法,请重新输入\n");
185         }
186 
187         while (1) {
188             printf("是否继续进行转换(Y/N)?\n");
189             char c;
190             scanf(" %c", &c);
191             if (c == 'Y' || c == 'y') {
192                 break;
193             } else if (c == 'N' || c == 'n') {
194                 return 0;
195             } else {
196                 printf("输入不合法,请重新输入\n");
197             }
198         }
199     }
200     return 0;
201 }

  该程序首先输出菜单供用户选择需要进行的转换类型,并提示用户输入相应的数字。接着,根据用户输入的数字,程序进入相应的功能函数中。对于输入的数值,在进行相应转换之前,都会进行有效性验证,判断其是否为合法的二进制数、八进制数或十六进制数。最后,程序会询问用户是否继续转换,如果用户输入的是Y,则返回到选择菜单部分;否则,退出整个程序。