c - C,将半字节从输入转换为十六进制
问题描述
我被要求创建一个程序,该程序接受 4 个二进制数字的用户输入并输出适当的十六进制等效值。我已经为我的代码创建了骨架,但是当我给程序输入时,它会回显我的输入。我的假设是我对函数的调用是错误的?但我不确定它是怎么回事。任何见解都会有所帮助。
另外,我创建的函数必须在它自己的单独文件中,我不能使用库函数。我也不能包含我的其他文件作为源文件,我只需要使用原型?是我被告知的。我正在终端上编译。我知道我要确定哪个 Hex 很长并且它们是更好的方法,但我只想先解决我的问题。
我将包含我的代码,如果有人需要澄清分配的规则,我可以在之后进行编辑。
#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;
}
解决方案
我建议您使用输入字符串转换为使用 base 2 的整数值(使用 eg strtol
)。然后很容易将该整数值转换为对应于十六进制值的字符。
也许是这样的:
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 中的所有字符串都是终止的,这意味着如果用户没有输入所有四位数字,您仍然可以通过检查条件中的终止符来循环,而不是硬编码四次迭代。
其次,我仍然建议您直接创建一个整数值而不是一个字符。主要是因为它更容易。
然后对于实际的代码:
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
}
推荐阅读
- php - 如何在 PHP 中格式化不同国家的邮政编码?
- sql - 根据案例陈述汇总结果
- tensorflow - 用tensorflow 2预测前得到模型提出的区域
- javascript - 是否可以更改 html 页面并仅显示选定的 iframe?
- xamarin - 使用 Prism 和 Xamarin 在 MVVM 中错误地绑定数据
- javascript - 使用 Axios 节点发布 Tableau REST API
- css - 如何为具有正弦运动和旋转的矩形设置动画?
- python - 如何计算 PySpark 中的行之间的差异?
- javascript - 转换 React useState hooks 以传入 props 并更新 prop 值
- elasticsearch - 通过 Kafka 将 gz 压缩日志文件从 s3 加载到 Elasticsearch