【C语言】练习3-5
- 题目来源:《The C programming language》中的习题P51
- 练习2-1: 编写函数itob(n, s, b),将整数n转换为以b为底的数,并将转换结果以字符的形式保存到字符串s中。例如,itob(n, s, 16)把整数n格式化成16进制整数保存在s中。
解题思路:这题本身并不难,由于习惯性思维,我们可能会忽略一些关键性的东西。比如,对于题目中的进制数,我们一般只会考虑到有2进制、8进制和16进制,其实 还有3进制,4进制...,总的来说进制数的范围为[2,36]。还有一点,对于整数,我们可能常常考虑的是正整数。下面我们看一下具体的代码实现。
代码实现:
#include <stdlib.h> #include <stdio.h> #include <string.h> /* 字符串逆转 */ void reverse_itob(char s[]) { int c, i, j; for ( i = 0, j = strlen(s)-1; i < j; i++, j--) { c = s[i]; s[i] = s[j]; s[j] = c; } } void itob(int n, char s[], int b) { static char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; int i, sign; // 判断是否位于进制数的范围 if ( b < 2 || b > 36 ) { fprintf(stderr, "EX3_5: 不持支持进制数 %d\n", b); exit(EXIT_FAILURE); } // 判断是否为负数 if ((sign = n) < 0){ n = -n; } i = 0; do { s[i++] = digits[n % b]; } while ((n /= b) > 0); if (sign < 0){ s[i++] = '-'; } s[i] = '\0'; reverse_itob(s); } int main(void) { char buffer[10]; int i; for ( i = 2; i <= 37; ++i ) { itob(255, buffer, i); printf("255 转化为%-2d 进制的结果为 : %s\n", i, buffer); } return 0; }