【发布时间】:2020-12-13 00:44:45
【问题描述】:
我是 C 编程新手。我正在编写一个将整数转换为十六进制的函数。
由于某种原因,我遇到了分段错误 11。请告知。谢谢!
这是我的函数的代码:
- 它首先将整数转换为二进制
- 在需要的地方加 0,所以二进制长度是 4 的倍数
- 反转二进制的顺序
- 将每 4 个数字转换为十六进制
void printHexadecimalForm( int X )
//Purpose: Print parameter X in hexadecimal form
//Output: Hexadecimal representation of X directly printed
//Assumption: X is non-negative (i.e. >= 0)
{
//[TODO] CHANGE this to your solution.
int input = X;
int output[32];
int i = 0;
while(input != 0){
if(input%2 != 0){
input = input - 1;
input /= 2;
output[i] = 1;
i++;
}
else{
input /= 2;
output[i] = 0;
i++;
}
}
while(i % 4 != 0){
output[i + 1] = 0;
i++;
}
for (int j = 0; j < i/2; j++)
{
int temp = output[j];
output[j] = output[i - 1 - j];
output[i - 1 - j] = temp;
}
int c, k = 0;
for(int z = 0; z < i; z += 4; ){
for (c = z; c < c + 4; c++){
k = 10 * k + output[c];
}
if(k == 0000){
printf("%d",0);
}
if(k == 0001){
printf("%d",1);
}
if(k == 0010){
printf("%d",2);
}
if(k == 0011){
printf("%d",3);
}
if(k == 0100){
printf("%d",4);
}
if(k == 0101){
printf("%d",5);
}
if(k == 0110){
printf("%d",6);
}
if(k == 0111){
printf("%d",7);
}
if(k == 1000){
printf("%d",8);
}
if(k == 1001){
printf("%d",9);
}
if(k == 1010){
printf("%c", 'A');
}
if(k == 1011){
printf("%c", 'B');
}
if(k == 1100){
printf("%c", 'C');
}
if(k == 1101){
printf("%c", 'D');
}
if(k == 1110){
printf("%c", 'E');
}
if(k == 1111){
printf("%c", 'F');
}
}
}
【问题讨论】:
-
当程序不能按预期工作时,要做的就是调试它。使用调试器。它会立即准确地告诉您哪行代码触发了段错误。它还可以让您单步执行代码并在运行时检查状态。
-
这甚至没有编译,所以它不能产生一个段错误
-
另外,如果你想将
X打印为十六进制,只需执行printf("%x", X) -
以
0开头的整数文字是八进制值,而不是十进制!! -
出于好奇,为什么要先转换成二进制?那为什么还要费心将 4 个二进制数字扩展为十进制数字呢?
标签: c binary segmentation-fault hex