【问题标题】:Converting hex to binary and then to decimal将十六进制转换为二进制,然后再转换为十进制
【发布时间】:2014-12-15 00:55:25
【问题描述】:

我的代码(如下)获取一个包含十六进制值的文本文件,并将十六进制值转换为二进制,然后再转换为十进制。然后我只想通过在我的主函数中添加一个 printf 语句来打印输出。但我无法弄清楚为什么我的 main 函数中的 printf 语句是错误的?提前致谢

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int hex_to_binary(char *hex_string, char *binary_line);
int bstr_to_dec(const char * str);

int main()
{
    FILE *file;;
    file = fopen("obj.txt","r");
    char line[200];
    char binary_line[20];

    while(!feof(file)){
        fgets(line,100,file);
        //hex_to_binary(line,binary_line);
        //printf("%s\n", binary_line);
        printf("%d\n",bstr_to_dec((hex_to_binary(line,binary_line))); //This line is having errors
        memset(binary_line,0,20);
    }
    fclose(file);
    getchar();
    return 0;
}

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

int bstr_to_dec(const char * str) 
{
    int val = 0;     
    while (*str != '\0')
    {
        val = 2 * val + (*str++ - '0');
    }
    return val;
}

我收到了这个错误

warning: incompatible integer to pointer conversion passing 'int' to parameter of type 'const char *' [-Wint-conversion]
            printf("%d\n",bstr_to_dec((hex_to_binary(line,binary_line))); 

【问题讨论】:

  • I cannot figure out why the printf statement in my main function is wrong。它有什么问题?
  • more (than) 和 hex_to_binary 返回 int 而不是 string
  • 看起来像你关于这个编程任务的第三个问题。注意:不要使用while(!feof(file)){ fgets(line,100,file);,使用while(fgets(line, sizeof line, file) != NULL) {
  • 顺便说一句,*binary_line = 0; = 效率更高,与在下一次循环迭代之前重置为零长度字符串一样有效。 Iow,memset 完全是矫枉过正。

标签: c arrays binary hex decimal


【解决方案1】:

您在使用 'hex_in_binary' 函数时犯了错误。

hex_in_binary(char *hex_string, char *binary_line) 总是返回0,修改binary_line的值。

您不使用 hex_in_binary 的返回值作为 bstr_to_dec 的第一个参数,而是使用 binary_line 作为第一个参数。

在您的代码中,以下行

    printf("%d\n",bstr_to_dec((hex_to_binary(line,binary_line))); //This line is having errors

应该改正如下

    hex_to_binary(line,binary_line);
    printf("%d\n",bstr_to_dec(binary_line));

您可能需要更正 Eric J 提到的 binary_line[] 的大小。

binary_line 的大小应大于您使用的文本文件的一行中的最大十六进制字符数乘以 4。

【讨论】:

    【解决方案2】:

    首先,您在 printf 行上有 4 个左括号 '(',而只有 3 个右括号 ')'。

    然后我们发现 hex_to_binary(...) 返回一个 int,而 bstr_to_dec(...) 期待的是一个字符串参数。

    要使用 hex_to_binary(...) 作为 bstr_to_dec(...) 的参数,它需要返回一个字符串。

    目前该函数会修改传入的binary_line[]的内容,但是函数完成后你不要使用该内容。您似乎打算返回字符串,而是返回硬编码为 0 的 int 值。

    提示:

    char *hex_to_binary(char *hex_string)
    char binary_line[200];
    ...
    return binary_line;
    

    【讨论】:

    • 我应该在哪里插入这个^?
    • 你应该重写函数看起来像这样。当前返回类型是 int 并且你总是返回 0。这只是糟糕的编程。
    【解决方案3】:

    您只为 binary_line 分配了 20 个字符

    char binary_line[20];
    

    但最终输出的总长度可能会明显超过 20 个字符。如果十六进制输入超过 5 个十六进制字符,您将覆盖分配给binary_line 的内存。

    每个十六进制字符将产生 4 个二进制数字。

    【讨论】:

    • 我收到此错误:: 警告:不兼容的整数到指针的转换将“int”传递给“const char *”类型的参数 [-Wint-conversion] printf("%d\n" ,bstr_to_dec((hex_to_binary(line,binary_line)));
    • 该错误是因为 hex_to_binary 返回 int,但 bstr_to_dec 需要一个指向 char 的指针
    猜你喜欢
    • 2016-12-25
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 2013-07-25
    相关资源
    最近更新 更多