繁体   English   中英

如何修复 C 程序中的分段错误 11?

[英]How To Fix Segmentation Fault 11 in a C program?

我是 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');
         }
            
    }

}

我建议你深呼吸,重新开始。 首先记住,没有必要任何东西转换成二进制。 一切都已经二进制的了。

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

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM