首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C,将四位字节从输入转换为十六进制

C,将四位字节从输入转换为十六进制
EN

Stack Overflow用户
提问于 2018-09-08 18:28:13
回答 2查看 1.1K关注 0票数 0

我被要求创建一个程序,它接受用户输入的4个二进制数字,并输出适当的十六进制等效值。我已经为我的代码创建了框架,但是当我给程序输入时,它会向我回显我的输入。我的假设是我对函数的调用是错误的?但我不太确定这是怎么回事。任何洞察力都会有所帮助。

另外,我创建的函数必须在它自己的单独文件中,并且我不能使用库函数。我也不能包含我的其他文件作为源文件,我只需要使用原型?我就是这么被告知的。我正在终端上编译。我知道我要确定哪个十六进制很长,他们的方法要好得多,但我只想先解决我的问题。

我将包括我的代码,如果任何人需要澄清分配的规则,我可以编辑后。

代码语言:javascript
复制
#include <stdio.h>

char nibbleToHex(char nibble[]);

int main(void) {
char nibble[5];

scanf("%4s", nibble);
//printf("This is a test line.\nYou entered: %4s.",nibble);
nibbleToHex(nibble);
printf("%4s\n", nibble);

return 0;
}


/**
 * This file contains the function nibbleToHex().
 *
 * @author:     Dominic Fanucchi
 * Course:      COMP B13
 * Created on:  Sep 4, 2018
 * Source File: nibbleToHex.c
 */

/**
 * Translates the input string of 4 ASCII zeroes and ones in nibble,
 * to the corresponding hexadecimal digit and returns that digit.
 *
 * @param nibble A C-nibble of 4 ones and zeroes
 * @return the corresponding hexadecimal digit
 */

#include <stdio.h>

char nibbleToHex(char nibble[]) {
char nibbleReturn;

if (nibble[0] == '0') {
    if (nibble[1] == '0') {
        if (nibble[2] == '0') {
            if (nibble[3] == '0')
                nibbleReturn = '0';
        }
    }
}

if (nibble[0] == '0') {
    if (nibble[1] == '0') {
        if (nibble[2] == '0') {
            if (nibble[3] == '1')
                nibbleReturn = '1';
        }
    }
}

if (nibble[0] == '0') {
    if (nibble[1] == '0') {
        if (nibble[2] == '1') {
            if (nibble[3] == '0')
                nibbleReturn = '2';
        }
    }
}

if (nibble[0] == '0') {
    if (nibble[1] == '0') {
        if (nibble[2] == '1') {
            if (nibble[3] == '1')
                nibbleReturn = '3';
        }
    }
}

if (nibble[0] == '0') {
    if (nibble[1] == '1') {
        if (nibble[2] == '0') {
            if (nibble[3] == '0')
                nibbleReturn = '4';
        }
    }
}

if (nibble[0] == '0') {
    if (nibble[1] == '1') {
        if (nibble[2] == '0') {
            if (nibble[3] == '1')
                nibbleReturn = '5';
        }
    }
}

if (nibble[0] == '0') {
    if (nibble[1] == '1') {
        if (nibble[2] == '1') {
            if (nibble[3] == '0')
                nibbleReturn = '6';
        }
    }
}

if (nibble[0] == '0') {
    if (nibble[1] == '1') {
        if (nibble[2] == '1') {
            if (nibble[3] == '1')
                nibbleReturn = '7';
        }
    }
}

if (nibble[0] == '1') {
    if (nibble[1] == '0') {
        if (nibble[2] == '0') {
            if (nibble[3] == '0')
                nibbleReturn = '8';
        }
    }
}

if (nibble[0] == '1') {
    if (nibble[1] == '0') {
        if (nibble[2] == '0') {
            if (nibble[3] == '1')
                nibbleReturn = '9';
        }
    }
}

if (nibble[0] == '1') {
    if (nibble[1] == '0') {
        if (nibble[2] == '1') {
            if (nibble[3] == '0')
                nibbleReturn = 'A';
        }
    }
}

if (nibble[0] == '1') {
    if (nibble[1] == '0') {
        if (nibble[2] == '1') {
            if (nibble[3] == '1')
                nibbleReturn = 'B';
        }
    }
}

if (nibble[0] == '1') {
    if (nibble[1] == '1') {
        if (nibble[2] == '0') {
            if (nibble[3] == '0')
                nibbleReturn = 'C';
        }
    }
}

if (nibble[0] == '1') {
    if (nibble[1] == '1') {
        if (nibble[2] == '0') {
            if (nibble[3] == '1')
                nibbleReturn = 'D';
        }
    }
}

if (nibble[0] == '1') {
    if (nibble[1] == '1') {
        if (nibble[2] == '1') {
            if (nibble[3] == '0')
                nibbleReturn = 'E';
        }
    }
}

if (nibble[0] == '1') {
    if (nibble[1] == '1') {
        if (nibble[2] == '1') {
            if (nibble[3] == '1')
                nibbleReturn = 'F';
        }
    }
}

return nibbleReturn;
}
EN

回答 2

Stack Overflow用户

发布于 2018-09-08 18:34:31

我建议您使用输入字符串转换为使用基数2的整数值(例如使用strtol)。然后很容易将该整数值转换为与十六进制值相对应的字符。

可能是这样的:

代码语言:javascript
复制
char nibbleToHex(char *nibble)
{
    int value = strtol(nibble, NULL, 2);

    if (value < 10)
        return value + '0';  // Return a character from '0' to '9'
    else
        return value + 'A';  // Works with ASCII encoding, not portable
}

使用strtol函数,您还可以添加一些验证,以确定输入是否正确。

如果不允许使用标准函数(输入/输出函数除外),那么可以使用循环并使用按位移位和加法。

首先,记住C中的所有字符串都是终止的,这意味着如果用户没有输入所有四位数,您仍然可以通过检查条件中的终止符来循环,而不是硬编码四次迭代。

其次,我仍然建议您创建一个整数值,而不是直接创建一个字符。主要是因为这样更容易。

然后对于实际的代码:

代码语言:javascript
复制
char nibbleToHex(char *nibble)
{
    int value = 0;  // The value we construct

    // Loop while the character nibble points to is not the terminator
    while (*nibble != '\0')
    {
        value <<= 1;  // Left-shift one bit
        value += *nibble - '0';  // Add the digit

        ++nibble;  // Point to the next character
    }

    if (value < 10)
        return value + '0';  // Return a character from '0' to '9'
    else
        return value + 'A';  // Works with ASCII encoding, not portable
}
票数 1
EN

Stack Overflow用户

发布于 2018-09-08 18:34:35

回答你的问题:你只是没有使用你的计算结果。

写入:

代码语言:javascript
复制
char result = nibbleToHex(nibble);
printf("%c\n", result);

顺便说一句:这个实现包含很多重复/相似的代码块。使用循环可能会大大减少代码量。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52234375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档