我在下面的一个代码块中遇到了分段错误,但我怀疑是这个错误,xbits.c:
#include <stdio.h>
#include <math.h>
void itox(int n, char hexstring[]);
int xtoi(char hexstring[]);
void itox(int n, char hexstring[]) {
hexstring[2*sizeof(n) + 1];
int ratio, remainder;
int i = 0;
while(ratio != 0)
{
ratio = n / 16;
remainder = n % 16;
if (remainder == 10){
hexstring[i] = 'A';
i++;
}
else if (remainder == 11){
hexstring[i] = 'B';
i++;
}
else if (remainder == 12){
hexstring[i] = 'C';
i++;
}
else if (remainder == 13){
hexstring[i] = 'D';
i++;
}
else if (remainder == 14){
hexstring[i] = 'E';
i++;
}
else if (remainder == 15){
hexstring[i] = 'F';
i++;
}
else
hexstring[i] = remainder;
}
i++;
hexstring[i] = ' ';
}
int xtoi(char hexstring[]) {
int i, integer;
int length = getLength(hexstring);
for (i = length-2 ; i >= 0 ; i--)
{
integer += (int) pow((float) hexstring[i] , (float) i);
}
return integer;
}
int getLength (char line[])
{
int i;
i=0;
while (line[i])
++i;
return i;
}
以上依赖于一个主方法showxbits.c,我还没有调试它,但当我使用测试主方法时,我得到了一个分段错误,当我使用gdb时,我收到了以下错误。
Program received signal SIGSEGV, Segmentation fault.
0x00000000004007ad in itox ()
这让我相信问题出在上面.c文件中的itox中。该程序应该将int转换为hex,将hex转换回int。
您的代码中有许多错误。您可以通过编译器警告捕获其中一些。不过,其中有些是逻辑错误。
ratio
未初始化,当您第一次在while
条件中使用它时,它将包含垃圾。它可能应该初始化为n
while
循环条件永远不会改变(初始值除外),因为ratio
永远是n / 16
,n
永远不会改变。您可能不需要ratio
,可以直接使用n
-
当你说
hexstring[i] = remainder
时,你并没有按照你想象的去做。你想分配一个数字,但你分配的字符的ASCII码是0到9,这些字符大多是不可打印的字符。(零甚至终止字符串。)您想要hexstring[i] = '0' + remainder;
在这里。使用
'A'
的字母也可以这样做。请注意,在数字的情况下,您不递增i
,从而在循环的下一次迭代中覆盖该数字。 -
单线
hexstring[2 * sizeof(n) + 1];
什么都不做。您必须在调用
itox
的函数中分配足够的内存。 - 你把字母按错误的顺序写在字符串上
- 解码时,不应根据十六进制数字的ASCII值来取其值。您必须将它们转换为0到15之间的值
- 不要将
pow
函数用于简单的整数运算。相反,按照itox
的模式,只需反过来:将结果乘以16,然后加上下一个十六进制数字的值 - 当然,您可以推出自己的
strlen
并将其称为getLength
,但请确保在调用它之前提供一个原型 - 这是一个小问题,但您的数字应该是
unsigned
,因为不存在负整数的十六进制表示