user-0 提问: 一个16进制转8进制的程序

回复:
user: user-0
content: 谢谢你了，我刚刚入csdn许多地方不懂，有不对希望别见怪

user: user-1
content: 引用 7 楼 晗生缘 的回复:楼主您好，您的2进制转为8进制的代码有的瑕疵。建议您先将16进制转为10进制，由10进制转为8进制。 /*将一个大写字母转换成小写字母*/ int tolower(char c) { 	if (c >= 'A'&&c <= 'Z') 	{ 		c = c + 'a' - 'A'; 	} 	return c; } /*将一个16进制的字符串改成整数*/ int htoi(char str[]) { 	int i; 	int n=0; 	if (str[0] == '0'&&(str[1] == 'x' || str[1] == 'X')) 	{ 		i = 2; 	} 	else 	{ 		i = 0; 	} 	for (; (str[i] >= '0'&&str[i] <= '9') || (str[i] >= 'a'&&str[i] <= 'z') || (str[i] >= 'A'&&str[i] <= 'Z'); i++) 	{ 		if (tolower(str[i]) > '9') 		{ 			n = 16 * n + (10 + tolower(str[i]) - 'a'); 		} 		else 		{ 			n = 16 * n + (tolower(str[i])-'0'); 		} 	} 	return n; } /*将整数转换成8进制数*/ char *itoo(int Num, char buf[]) { 	int i = 0; 	int j; 	char temp; 	while (Num != 0) 	{ 		buf[i++] = Num % 8 + '0'; 		Num = Num / 8; 	} 	for (j = 0; j < (i / 2); j++) 	{ 		temp = buf[j]; 		buf[j] = buf[i - j - 1]; 		buf[i - j - 1] = temp; 	} 	return buf; } /*将16进制转换为8进制*/ char *htoo(char buf[]) { 	int n; 	char *p = NULL; 	n = htoi(buf); 	p = itoo(n, buf); 	return buf; } int main() { 	char str[N]; 	char n[N]; 	int i=0,len; 	char *p = NULL; 	printf("Please input:\n"); 	scanf("%s",str); 	p=htoo(str); 	for (i = 0; i < N; i++) 	{ 		printf("%c\t",str[i]); 	} 	system("pause"); 	return 0; }十六进制转八进制  需要注意 这题目的数值非常大远远超过int取值范围  你的想法是错误的  这题目的基本思路不应该借助十进制做中转 应该借助二进制做中转  一位十六进制 转换为 四位二进制 一位八进制 转换成 三位二进制  所以 三位十六进制 能转换成 四位八进制 按照这个思路 把字符串按照三位一组进行分组 每次转换出四位八进制存到一个字符串里面 最后输出字符串就好了

user: user-2
content: 楼主您好，您的2进制转为8进制的代码有的瑕疵。建议您先将16进制转为10进制，由10进制转为8进制。 /*将一个大写字母转换成小写字母*/ int tolower(char c) { 	if (c >= 'A'&&c <= 'Z') 	{ 		c = c + 'a' - 'A'; 	} 	return c; } /*将一个16进制的字符串改成整数*/ int htoi(char str[]) { 	int i; 	int n=0; 	if (str[0] == '0'&&(str[1] == 'x' || str[1] == 'X')) 	{ 		i = 2; 	} 	else 	{ 		i = 0; 	} 	for (; (str[i] >= '0'&&str[i] <= '9') || (str[i] >= 'a'&&str[i] <= 'z') || (str[i] >= 'A'&&str[i] <= 'Z'); i++) 	{ 		if (tolower(str[i]) > '9') 		{ 			n = 16 * n + (10 + tolower(str[i]) - 'a'); 		} 		else 		{ 			n = 16 * n + (tolower(str[i])-'0'); 		} 	} 	return n; } /*将整数转换成8进制数*/ char *itoo(int Num, char buf[]) { 	int i = 0; 	int j; 	char temp; 	while (Num != 0) 	{ 		buf[i++] = Num % 8 + '0'; 		Num = Num / 8; 	} 	for (j = 0; j < (i / 2); j++) 	{ 		temp = buf[j]; 		buf[j] = buf[i - j - 1]; 		buf[i - j - 1] = temp; 	} 	return buf; } /*将16进制转换为8进制*/ char *htoo(char buf[]) { 	int n; 	char *p = NULL; 	n = htoi(buf); 	p = itoo(n, buf); 	return buf; } int main() { 	char str[N]; 	char n[N]; 	int i=0,len; 	char *p = NULL; 	printf("Please input:\n"); 	scanf("%s",str); 	p=htoo(str); 	for (i = 0; i < N; i++) 	{ 		printf("%c\t",str[i]); 	} 	system("pause"); 	return 0; }

user: user-1
content: 比如输入  1 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 你的代码就错了

user: user-1
content: 每个十六进制数长度不超过100000  你的数组太小了

user: user-3
content: 简单写一个：  #include <stdio.h> #include <string.h>  char b[100001], c[9]; char t[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0,0,0,0,0,0,0, 10, 11, 12, 13, 14, 15};  int main() {   int n, i, p, q, r, x;    scanf("%d", &n);   while (n--)   {     scanf("%s", b);     q = (p = strlen(b)) / 6, (r = p % 6) ? r : (q--, r = 6);     for (x = 0, i = r; i; i--) x += t[b[i - 1] - 48] * (1 << (r - i) * 4);     for (p = 8; x; x >>= 3) c[--p] = (x & 7) + 48;     printf("%s", &c[p]);     for (x = 0, p = 0; p < q; p++)     {       for (i = 0; i < 6; i++) x += t[b[p * 6 + r + i] - 48] * (1 << (5 - i) * 4);       for (i = 7; i >= 0; i--) c[i] = (x & 7) + 48, x >>= 3;       printf("%s", c);     }     puts("");   }    return 0; }

user: user-4
content: 看上去你使用大量c99特征，如；动态数组，即时变量。

user: user-0
content: 题目 问题描述 　　给定n个十六进制正整数，输出它们对应的八进制数。  输入格式 　　输入的第一行为一个正整数n （1<=n<=10）。 　　接下来n行，每行一个由0~9、大写字母A~F组成的字符串，表示要转换的十六进制正整数，每个十六进制数长度不超过100000。  输出格式 　　输出n行，每行为输入对应的八进制正整数。  　　 　　输入的十六进制数不会有前导0，比如012A。 　　输出的八进制数也不能有前导0。  样例输入 　　2 　　39 　　123ABC  样例输出 　　71 　　4435274  　　 　　先将十六进制数转换成某进制数，再由某进制数转换成八进制。

user: user-0
content: 运行出错，什么原因，在codeblocks上输入输出没问题，但在蓝桥杯里边评测确是运行错误，大佬出来帮帮忙