【问题标题】:How To Fix Segmentation Fault 11 in a C program?如何修复 C 程序中的分段错误 11?
【发布时间】:2020-12-13 00:44:45
【问题描述】:

我是 C 编程新手。我正在编写一个将整数转换为十六进制的函数。

由于某种原因,我遇到了分段错误 11。请告知。谢谢!

这是我的函数的代码:

  1. 它首先将整数转换为二进制
  2. 在需要的地方加 0,所以二进制长度是 4 的倍数
  3. 反转二进制的顺序
  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


【解决方案1】:

我建议你深呼吸,重新开始。首先请记住,没有必要将任何内容转换 为二进制。一切都是二进制的。

也许这个检索两个十六进制字符的小片段可以帮助您进入正题:(这只是一种方法)

int n = 165;         // this is the number we want to display in hex (165 is 0xa5)
int i, hexChar;

i = n & 0xF;          // bitwise AND with 00...001111

if(i < 10)            // look up to ASCII table for more info
    hexChar = i + 48; // character '0' is code 48, '1' is 49 etc.
else
    hexChar = i + 55; // character 'A' is code 65, 'B' is 66 etc.

printf("Rigth most hex: %c\n", hexChar);

i = n >> 4;           // shift all bits 4 steps to the right
i = i & 0xF;          // bitwise AND with 00...001111

if(i < 10)            // look up to ASCII table for more info 
    hexChar = i + 48; // character '0' is code 48, '1' is 49 etc.
else
    hexChar = i + 55; // character 'A' is code 65, 'B' is 66 etc.
    
printf("Second hex: %c\n", hexChar);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-09
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 2021-07-18
    相关资源
    最近更新 更多