2014-10-20 4 views
-1

Мой код (ниже) принимает текстовый файл с шестнадцатеричными значениями и преобразует шестнадцатеричное значение в двоичное, а затем в десятичное. Затем я просто хочу распечатать вывод, добавив инструкцию printf в мою основную функцию. Но я не могу понять, почему утверждение printf в моей основной функции неверно? Заранее спасибоПреобразование hex в двоичный, а затем в десятичный

#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))); 
+0

'Я не могу понять, почему утверждение printf в моей основной функции неверно'. Что с этим не так? –

+0

more (than) и hex_to_binary возвращает int not string – CharlieS

+0

Похож на ваш третий вопрос по этой задаче программирования. Примечание: не используйте 'while (! Feof (файл)) {fgets (строка, 100, файл);', используйте 'while (fgets (строка, размер строки, файл)! = NULL) {'. – chux

ответ

0

Вы сделали ошибку об использовании функции «hex_in_binary».

hex_in_binary (char * hex_string, char * binary_line) возвращает 0 всегда, а значение binary_line - изменено.

Вы не используете возвращаемое значение hex_in_binary как первый аргумент bstr_to_dec, но используете binary_line как первый argumetn.

В своем коде, следуя линии

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

Shoule корректируется следующим образом

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

Вы, возможно, потребуется скорректировать размер binary_line [] как было упомянуто Eric J.

Размер binary_line должно быть больше максимального числа шестнадцатеричных символов в строке используемого вами текстового файла, умноженного на 4.

0

Вы только выделили 20 символов для binary_line

char binary_line[20]; 

но общая длина конечной продукции может быть значительно больше чем 20 символов. Если шестнадцатеричный ввод содержит более 5 шестнадцатеричных символов, вы перезапишете память, выделенную для binary_line.

Каждый шестнадцатеричный символ приведет к 4 двоичным разрядам.

+0

Я получаю эту ошибку :: warning: несовместимое целое число для преобразования указателя, передающего 'int' в параметр типа 'const char *' [-Wint-conversion] printf ("% d \ n", bstr_to_dec ((hex_to_binary (line, binary_line))); – Landon

+0

, что ошибка связана с тем, что hex_to_binary возвращает int, но bstr_to_dec ожидает указатель на char – CharlieS

0

Во-первых, у вас есть 4 открытых скобки '(', и только 3 закрывающие скобки ')' на линии printf.

Затем мы обнаруживаем, что hex_to_binary (...) возвращает int, но bstr_to_dec (...) ожидает строковый параметр.

Чтобы использовать hex_to_binary (...) в качестве параметра bstr_to_dec (...), ему нужно вернуть строку.

В настоящее время функция изменяет содержимое binary_line [], но вы не используете контент после завершения этой функции. Похоже, что вы намерены вернуть строку, но вместо того, чтобы возвращать целочисленное значение жёстко прописанные 0.

намек:

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

Где я должен вставить этот^ – Landon

+0

, вы должны переписать функцию так, чтобы она выглядела так: в настоящее время тип возврата - это int, и вы всегда return 0. Это просто плохое программирование. – CharlieS

Смежные вопросы