将二进制数转换为十六进制的C程序不能转换两个以上的二进制数,如果它们等于十六进制字母

将二进制数转换为十六进制的C程序不能转换两个以上的二进制数,如果它们等于十六进制字母,c,C,例如,如果我输入101010101010,它应该等于AAA,但它不起作用。它仅在一次少于两个字母时返回字母。例如,如果我输入10101010,它就会工作。它返回AA。请帮忙 #include <stdio.h> #include <math.h> #include <string.h> void binary_hex(int n, char hex[]); int hex_binary(char hex[]); int main() { printf

例如,如果我输入101010101010,它应该等于AAA,但它不起作用。它仅在一次少于两个字母时返回字母。例如,如果我输入10101010,它就会工作。它返回AA。请帮忙

#include <stdio.h>
#include <math.h>
#include <string.h>
void binary_hex(int n, char hex[]);
int hex_binary(char hex[]);

int main()
{
    printf("Enter binary number: ");
    scanf("%d",&n);
    binary_hex(n,hex);
    printf("Hexadecimal number: %s",hex);
}

void binary_hex(int n, char hex[]) /* Function to convert binary to hexadecimal. */
{
    int i=0,decimal=0, rem;
    while (n!=0)
    {
        decimal += (n%10)*pow(2,i);
        n/=10;
        ++i;
    }

/* At this point, variable decimal contains binary number in decimal format. */
    i=0;
    while (decimal!=0)
    {
        rem=decimal%16;
        switch(rem)
        {
            case 10:
              hex[i]='A';
              break;
            case 11:
              hex[i]='B';
              break;
            case 12:
              hex[i]='C';
              break;
            case 13:
              hex[i]='D';
              break;
            case 14:
              hex[i]='E';
              break;
            case 15:
              hex[i]='F';
              break;
            default:
              hex[i]=rem+'0';
              break;
        }
        ++i;
        decimal/=16;
    }
    hex[i]='\0';
    strrev(hex);       /* Function to reverse string. */
}

您还没有显示完整的程序-在main中的任何作用域中都没有声明n。假设int n,您的第一个问题是:

printf("Enter binary number: ");
scanf("%d",&n);
您正在将中的1和0字符串读取为以10为基数的十进制整数。相反,您应该编写一个函数,接受const char*并对每个字符进行迭代,验证它是1还是0,解释每个字符的值,并累计总数。提示:从右到左的顺序可能更容易操作

int parse_binary(const char *str)
{
    int total = 0;

    while (...) {
       total += ...
    }

    return total;
}
另一个提示:不要重新发明轮子。当然,在你之前有人想用C解析二进制数,不是吗?查看strtoul-即其第三个参数的描述

注意:到目前为止,我提到的两件事都将二进制值限制为32位或64位,这取决于您的数据类型选择。如果不需要实际使用整数值,只需将1和0的字符串转换为任意长度的十六进制值字符串,则可以将问题分解为更简单的步骤

我们真正喜欢使用十六进制的原因是十六进制值中的每个字符正好代表一个半字节,也就是四位。这意味着四个1或0组成的每组恰好对应一个十六进制字符。假设输入的长度始终是4个字符的倍数,则可以轻松处理任意长的字符串

D    E    A    D    B    E    E    F
1101 1110 1010 1101 1011 1110 1110 1111

非常适合初学者的解决方案。这适用于较大的二进制数/字符串

#include <stdio.h>
#include <string.h>
int main()
{
    int hexConstant[] = {0, 1, 10, 11, 100, 101, 110, 111, 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111};

    char hex[20000];
    char binary[20000];
    int index, i, digit;

    printf("Enter binary string: ");
    scanf("%s", binary);

    index = 0;
    int len = strlen(binary) ;
    for(int j =  len-1; j>=0; j-=4) {

         if(j-3>=0) digit = (binary[j-3]-'0')*1000 + (binary[j-2]-'0')*100 + (binary[j-1]-'0') * 10 + (binary[j]-'0');
         else if(j-3>=0) digit = (binary[j-2]-'0')*100 + (binary[j-1]-'0') * 10 + (binary[j]-'0');
         else if(j-1>=0) digit = (binary[j-1]-'0') * 10 + (binary[j]-'0');
         else digit = (binary[j]-'0');

         for(i=0; i<16; i++)
        {
            if(hexConstant[i] == digit)
            {
                if(i<10)
                {
                    hex[index] = (char)(i + 48);
                }
                else
                {
                    hex[index] = (char)((i-10) + 65);
                }

                index++;
                break;
            }
        }
    }

    hex[index] = '\0';

    strrev(hex);

    printf("Hexadecimal number = %s", hex);

    return 0;
}

int32的最大值为2147483647。2147483647<101010101010Jonathon,谢谢,我还不太擅长编程,但我明白你的意思。我感谢你的时间和帮助!