【问题标题】:conversion from hexadecimal to binary从十六进制转换为二进制
【发布时间】:2014-09-03 10:44:40
【问题描述】:

我正在尝试用十六进制字符串显示二进制字符串。我的代码是

#include <stdio.h>
int main() {
    char hexa[5], num[120];
    int i = 0, j, k, t;
    char ch;
    printf("enetr hexadecimal");
    while (ch = getchar() != '\n') {
        scanf("%c", &ch);
        hexa[i] = ch;
        i++;
    }
    k = 0;
    for (j = 0; hexa[j] != '\0'; j++) {
        if (hexa[j] == 'A') {
            num[k++] = '1';
            num[k++] = '0';
            num[k++] = '1';
            num[k++] = '0';
        } else if (hexa[j] == 'B') {
            num[k++] = '1';
            num[k++] = '0';
            num[k++] = '1';
            num[k++] = '1';
        } else if (hexa[j] == 'C') {
            num[k++] = '1';
            num[k++] = '1';
            num[k++] = '0';
            num[k++] = '0';
        } else if (hexa[j] == 'D') {
            num[k++] = '1';
            num[k++] = '1';
            num[k++] = '0';
            num[k++] = '1';
        } else if (hexa[j] == 'E') {
            num[k++] = '1';
            num[k++] = '1';
            num[k++] = '1';
            num[k++] = '0';
        } else if (hexa[j] == 'F') {
            num[k++] = '1';
            num[k++] = '1';
            num[k++] = '1';
            num[k++] = '1';
        } else if (hexa[j] == '0') {
            num[k++] = '0';
            num[k++] = '0';
            num[k++] = '0';
            num[k++] = '0';
        } else if (hexa[j] == '1') {
            num[k++] = '0';
            num[k++] = '0';
            num[k++] = '0';
            num[k++] = '1';
        } else if (hexa[j] == '2') {
            num[k++] = '0';
            num[k++] = '0';
            num[k++] = '1';
            num[k++] = '0';
        } else if (hexa[j] == '3') {
            num[k++] = '0';
            num[k++] = '0';
            num[k++] = '1';
            num[k++] = '1';
        } else if (hexa[j] == '4') {
            num[k++] = '0';
            num[k++] = '1';
            num[k++] = '0';
            num[k++] = '0';
        } else if (hexa[j] == '5') {
            num[k++] = '0';
            num[k++] = '1';
            num[k++] = '0';
            num[k++] = '1';
        } else if (hexa[j] == '6') {
            num[k++] = '0';
            num[k++] = '1';
            num[k++] = '1';
            num[k++] = '0';
        } else if (hexa[j] == '7') {
            num[k++] = '0';
            num[k++] = '1';
            num[k++] = '1';
            num[k++] = '1';
        } else if (hexa[j] == '8') {
            num[k++] = '1';
            num[k++] = '0';
            num[k++] = '0';
            num[k++] = '0';
        } else if (hexa[j] == '9') {
            num[k++] = '1';
            num[k++] = '0';
            num[k++] = '0';
            num[k++] = '1';
        }
    }
    for (t = 0; num[t] != '\0'; t++)
        printf("%c", num[t]);
    return 0;
}

这个 sn-p 只从十六进制字符串的第一个字符开始显示,而不是整个字符串。请帮助解决导致错误的原因并帮助我纠正错误

【问题讨论】:

  • 您的代码存在多个问题。从循环读取输入开始,您没有任何边界检查,您没有检查输入是否有效,eloop 条件不是您所期望的(阅读关于operator precedence)并且您阅读了两个在循环的每次迭代中输入的字符。然后在下一个循环中查找 hexa 数组中的字符串终止符,但实际上并没有将它添加到数组中。
  • 最后,在fgetsstrtol 的帮助下,您可以轻松地将代码缩减到大约十行左右。
  • 不要在scanf里面使用while,你不需要它,它是多余的。您已经使用 getchar()... 从控制台读取了字符
  • 谢谢我理解我的错误
  • 接收字符串'hexa'应预初始化为全0x00 开发字符串'num'应预初始化为全0x00

标签: c


【解决方案1】:

您(出于某种原因)将其作为文本处理,这比将其作为实际数字处理要复杂得多。

您可以通过以下方式逃脱:

unsigned int hexa;

if(scanf(" %x", &hexa) == 1)
{
  int i;
  for(i = (CHAR_BIT * sizeof hexa) - 1; i >= 0; --i)
  {
    putchar('0' + ((hexa & (1u << i)) != 0));
  } 
  putchar('\n');
}

上面将始终生成一个固定(可能是 32 位)宽度的二进制,如果你真的想要一个可变长度的二进制数,你可以做不同的事情。

【讨论】:

    【解决方案2】:

    这对你有用-

    # include <stdio.h>
    int main()
    {
            unsigned int num;
            int i, j;
    
            printf("Enter an Hex number\n");
            if(scanf(" %x", &num)!=1){
            printf("Enter proper Hexadecimal number\n");
            return 0;
            }
            printf("%x in binary format is- \n", num);
            for (i = 31; i >= 0; i--)
            {
                    if ((num>>i)&1)
                            printf("1");
                    else
                            printf ("0");
            }
            printf("\n");
            return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-06-05
      • 1970-01-01
      • 2012-06-26
      • 2019-06-10
      • 1970-01-01
      • 2014-10-30
      • 2016-08-28
      相关资源
      最近更新 更多