C语言 如何将十六进制值转换为二进制值

avkwfej4  于 2023-05-06  发布在  其他
关注(0)|答案(4)|浏览(252)

如何修复我的代码?我有一个十六进制值的文本文件。现在我需要将十六进制值转换为二进制值并打印出来。这是我目前为止的代码:

#include <stdio.h>
#include <stdlib.h>
#define MAX 1000

int hex_to_binary(char *argv[])

int main(int argc, char *argv[])
{
    FILE *file;
    file = fopen(argv[1], "r");
    char line[100];

    while(!feof(file)) {
        fgets(line, 100, file);
        hex_to_binary(line);
    }
    fclose(file);

    return 0;
}

int hex_to_binary(char *argv[]) {
    char binaryNumber[MAX], hexaDecimal[MAX];
    long int i = 0;

    scanf(“%s”, argv[1]);

    printf("\nEquivalent binary value: ");
    while(hexaDecimal[i]) {
         switch(hexaDecimal[i]) {
             case '0': printf("0000"); break;
             case '1': printf("0001"); break;
             case '2': printf("0010"); break;
             case '3': printf("0011"); break;
             case '4': printf("0100"); break;
             case '5': printf("0101"); break;
             case '6': printf("0110"); break;
             case '7': printf("0111"); break;
             case '8': printf("1000"); break;
             case '9': printf("1001"); break;
             case 'A': printf("1010"); break;
             case 'B': printf("1011"); break;
             case 'C': printf("1100"); break;
             case 'D': printf("1101"); break;
             case 'E': printf("1110"); break;
             case 'F': printf("1111"); break;
             case 'a': printf("1010"); break;
             case 'b': printf("1011"); break;
             case 'c': printf("1100"); break;
             case 'd': printf("1101"); break;
             case 'e': printf("1110"); break;
             case 'f': printf("1111"); break;
             default:  printf("\nInvalid hexadecimal digit %c ", hexaDecimal[i]);                              return 0;
         }
         i++;
    }

    return 0;
}

我不断收到错误,例如:

part1_V2.c: In function ‘hex_to_binary’:
part1_V2.c:8: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
part1_V2.c:22: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’    token
part1_V2.c:26: error: stray ‘\342’ in program
part1_V2.c:26: error: stray ‘\200’ in program
part1_V2.c:26: error: stray ‘\234’ in program
part1_V2.c:26: error: stray ‘\342’ in program
part1_V2.c:26: error: stray ‘\200’ in program
part1_V2.c:26: error: stray ‘\235’ in program
part1_V2.c:59: error: expected ‘{’ at end of input

我让我的代码工作,但现在我有问题的输出:
我传递给main函数的文本文件包含:
“1283”(第1行)“5105”(下一行)
这些是文件中的十六进制值。所以当我运行程序时,我得到输出:
等效二进制值:0001001010000011
无效的十六进制数字
无效的十六进制数字
等效二进制值:0101000100000101
为什么我得到无效的十六进制数字输出?是因为它试图将“\n”或空格转换为二进制吗?

w6lpcovy

w6lpcovy1#

在你的代码中似乎有几个非ASCII字符,例如。"",应为**"**。
剩下的是语法和类型错误。

6l7fqoea

6l7fqoea2#

您的代码中有一些语法错误。试试这个修改过的代码。如果你向main()传递了正确的参数,那么它应该可以工作:

#include <stdio.h>

int hex_to_binary(char*);

int main(int argc, char *argv[])
{
    FILE *file;
    file = fopen(argv[1],"r");
    char line[100];

    while(!feof(file)){
        fgets(line,100,file);
        hex_to_binary(line);
    }
    fclose(file);
    getchar();
    return 0;
}

int hex_to_binary(char* hex_string)
{
    int i=0;
    printf("\nEquivalent binary value: ");
    while(hex_string[i])
    {
         switch(hex_string[i])
         {
             case '0': printf("0000"); break;
             case '1': printf("0001"); break;
             case '2': printf("0010"); break;
             case '3': printf("0011"); break;
             case '4': printf("0100"); break;
             case '5': printf("0101"); break;
             case '6': printf("0110"); break;
             case '7': printf("0111"); break;
             case '8': printf("1000"); break;
             case '9': printf("1001"); break;
             case 'A': printf("1010"); break;
             case 'B': printf("1011"); break;
             case 'C': printf("1100"); break;
             case 'D': printf("1101"); break;
             case 'E': printf("1110"); break;
             case 'F': printf("1111"); break;
             case 'a': printf("1010"); break;
             case 'b': printf("1011"); break;
             case 'c': printf("1100"); break;
             case 'd': printf("1101"); break;
             case 'e': printf("1110"); break;
             case 'f': printf("1111"); break;
             default:  printf("\nInvalid hexadecimal digit %c ", hex_string[i]);
        }
        i++;
    }
    return 0;
}
kmb7vmvb

kmb7vmvb3#

第一个小错误出现在第5行的函数定义中。在末尾添加分号:

int hex_to_binary(char *argv[]);

此外,它没有任何用处,因此删除这一行:

scanf(“%s”, argv[1]);

重写while循环:

while(hexaDecimal[i]!='\n' && hexaDecimal[i]!='\0')
{
  switch(hexaDecimal[i])
  {
     ...
  }
  i++;
}

请注意,i++在循环内。加上结尾的return 0语句在任何函数之外。把它移进去。

4jb9z9bj

4jb9z9bj4#

正如注解中提到的,在第5行缺少一个;
缺少;可能会导致一连串错误,因为编译器会寻找一些东西来结束语句(这不是由;结束的)。
记住这一点,尝试依次修复每个错误。错误消息看起来总是非常技术性的,但是如果你停下来阅读它,它会给出很多信息。
所以对于第一个错误,在第8行,它指出它期望的是{。因为这是main函数的开始,所以第7-8行的内容是正确的,所以错误必须在这两行之前。
在你的main函数之前是一个函数原型,它... * 啊哈 *... * 缺少分号 *。
至于说stray \xxx in program的错误,这可能是因为你已经从word文档或网站复制了scanf("%s", argv[1])行,并且它复制了一对格式化的引号。
要解决这个问题,只需删除引号并手动输入即可。

相关问题