0
#include<stdio.h>

int main()
{
int input = 0;
int binaryNumber = 0;
int decimalNumber = 0;
int remainder = 0;
int i = 1;
int wholeNumber = 0;\
int number = 0;
char hexLetters[] = "ABCDEF";


printf("Press 1 to convert Binary to Hex\n");
printf("Press 2 to convert Hex to Binary\n");
printf("Press 3 to convert Decimal to 2's to Compliment Binary\n");
scanf("%d",&input);
printf("\n");

switch (input)
{
    case 1:
    {

    printf("Enter a Binary number\n");
    scanf("%d",&binaryNumber);

    char binaryToHex[2];
    while(binaryNumber != 0)
    {
        remainder = binaryNumber%10;
        decimalNumber = decimalNumber + (remainder*i);
        i = i*2;
        binaryNumber = binaryNumber/10;
    }
    while(decimalNumber != 0)
    {
    remainder = decimalNumber%16;
    wholeNumber = (decimalNumber%16)-(remainder/16);

    decimalNumber = 0;
    }

    int j = 1;
    for(j=1;j<16;j++){
        if(remainder ==j){
            binaryToHex[1] = hexLetters[j-10];
        }
        else{
            binaryToHex[1] = remainder;
        }
    }

    int k = 1;
    for(k=1;k<16;k++){
        if(wholeNumber == k){
            binaryToHex[0] = hexLetters[k-10];
        }
        else{
            binaryToHex[0] = wholeNumber;
        }
    }

    printf("%c%c\n", binaryToHex[0], binaryToHex[1]);

请帮助什么都不会显示,经过一些修补后只有 F 会显示这是
错误的。我已经检查以确保余数和整数都在工作并且它确实得到了正确的数字但是当我尝试将一个字母存储到 binaryToHex 时它总是 F 或者它什么都没有。请帮忙

4

2 回答 2

0

最大的问题可能在这一行:

binaryToHex[1] = remainder;

和类似的binaryToHex[0]声明。这应该是一个角色(当它是 AF 时)。相反,在这里,您正在分配一个数字。这将导致打印与该数字相对应的 ASCII 字符,对于 0-9,该字符在不可打印值 (NUL-TAB) 的范围内。

ASCII 整数从 48 开始表示“0”。因此,一种解决方法是在形成最终输出时向remainderandwholeNumber变量添加 48(或删除所有“幻数”,“0”),例如

binaryToHex[1] = remainder + '0';

另一个问题(我刚刚意识到)是你的循环。

for(k=1;k<16;k++){
    if(wholeNumber == k){
        binaryToHex[0] = hexLetters[k-10];
    }
    else{
        binaryToHex[0] = wholeNumber;
    }
}

因此,请快速考虑一下。对于 1-16,如果数字匹配,则为其分配一个十六进制字母,否则,分配数字。这在逻辑上是错误的。假设我们有 5 的值,k将增加到 5,这将导致第一个子句成功。这将分配hexLetters[5-10]binaryToHex[0],这实际上可能导致访问冲突。然后,k将继续增加到16,这将导致else子句继续执行,覆盖我们刚刚得到的值。

要修复,break当你找到正确的数字时,稍微调整一下你的逻辑,例如:

for(k=1;k<16;k++){
    if(wholeNumber == k){
        if(k < 10)
            binaryToHex[0] = k + '0';
        else
            binaryToHex[0] = hexLetters[k-10];

        break;
    }
}
于 2013-02-16T01:11:48.073 回答
0

你确定你的逻辑是对的?我尝试输入 10 来跟踪它,但无济于事。我认为这段代码有很多问题。

无论如何你的问题

此语句:binaryToHex[1] = 余数;

或此语句: binaryToHex[0] = wholeNumber;

将 int 分配给 binaryToHex[0];

所以当你使用 printf("%c", binaryToHex[1]);

您可以将 printf 更改为 printf("%i", binaryToHex[1]) ,它将打印出数字。但是,根据我在您的代码中看到的内容,binaryToHex[1] 和 [0] 可以分配一个数字或一个字符,因此如果它分配一个字符但您使用 %i 那么您将遇到同样的问题. 您可以改为将整数 0 的 asci 编号添加到您的语句中,方法是像 binaryToHex[1] = 余数 + '0' 一样附加它。因此,如果 binaryToHex[1] 的值为 7,您将打印一个不可打印的 ascii 字符,但通过向其添加“0”或 48,您将打印 55 的 ascii 表示,即 7,就像您想要的那样。但我认为您应该考虑重写代码以避免这些黑客攻击。

无论如何,我认为你应该从你的代码逻辑开始,因为我认为它有缺陷,但我可能是错的,因为我没有编译器来测试它。

于 2013-02-16T02:03:07.543 回答