2014-10-19 4 views
0

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

#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; 
     } 
     i++; 
    } 
    return 0; 
} 
+0

Вы не можете вернуться массивы в языке программирования Си. Вы можете вернуть указатель на память, полученную через 'malloc()' или подобную функцию, если это то, что вы хотите. – fuz

+0

Как бы реализовать это в моем коде? извините, что я пришел из фона Python – Landon

ответ

0

Функция strcat() - это то, что вы хотите.

, если бы я тебя, для простоты я делаю это один ниже:

Определение Глобальный массив символов:

char buffer[1000]; // define a space to write our string 

.... 

Изменить шестнадцатеричный функцию следующим образом:

while(hex_string[i]) 
     { 
      switch(hex_string[i]) 
      { 
       case '0': strcat(buffer,"0000"); break; 
       case '1': strcat(buffer,"0001"); break; 
       case '2': strcat(buffer,"0010"); break; 
       .... 
      } 
     } 

В главном использовании это для печати вашей строки:

printf("%s\n",buffer); 

Примечание. Не забудьте очистить буфер после каждого вызова функции hex_to_binary (в противном случае он сохранит предыдущие номера внутри)

+0

Я получаю сообщение об ошибке: использование необъявленного идентификатора «buffer» - когда я вставляю этот вывод printf в main. А также как вы очистите буфер? – Landon

0

Существует несколько способов сделать это.

Единственная вещь, которую вы не может do объявляет массив символов в функции, используйте sprintf для печати и верните его. Вы не можете быть уверены, что пространство, на которое он указывает, существует больше после возвращения функции.

То есть, НЕ сделать это:

int hex_to_binary(char *hex_string) 
{ 
    char binary_string[MAX_SIZE + 1]; 

    <...> 

    return binary_string; 
} 

Чтобы сделать именно то, что вы утверждаете, вы можете вызвать таНос, чтобы получить пространство внутри функции, а затем возвращает указатель на него:

int hex_to_binary(char *hex_string) 
{ 
    char *binary_string; 

    if((binary_string = malloc(MAX_SIZE + 1)) == NULL) 
     return -1; /* Indicate failure */ 
    binary_string[0] = '\0'; 

    <etc> 

     switch(hex_string[i]) 
     { 
      case '0' : strcat(binary_string, "0000"); break; 

    <etc> 

    return binary_string; 
} 

Это разрешено, поскольку malloc выделяет память, возможно, в куче, и эта память все еще будет существовать впоследствии. Проблема в том, что функция, которая вызывает hex_to_binary, должна вызывать free(), чтобы освободить эту память, иначе каждый вызов украдет немного памяти - это называется утечкой памяти.

То есть, сделать:

char *binary_line; 

while(!feof(file)){ 
    fgets(line,100,file); 
    binary_line = hex_to_binary(line); 
    printf("%s", binary_line); 
    free(binary_line); 
} 

НЕ

while(!feof(file)){ 
    fgets(line,100,file); 
    printf("%s", hex_to_binary(line);); 
} 

Если вы должны были вызвать hex_to_binary в цикле, один раз в шестнадцатеричной цифре, вы можете изменить заявление случая, чтобы вернуться указатель на строку, а не печать:

switch(hex_digit) 
{ 
    case '0' : return "0000"; 
    case '2' : return "0001"; 

    <etc> 

T он возвращает указатель на постоянную строку, которую вы могли бы распечатать, и затем освобождает пространство.

Другим вариантом было бы передать hex_to_binary два параметра, один со строкой для преобразования, и один указатель на место, чтобы записать его:

int hex_to_binary(char *hex_string, char *binary_line) 
{ 
    <etc> 

     switch(hex_string[i]) 
     { 
      case '0' : strcat(binary_string, "0000"); break; 

    <etc> 

    return 0; 
} 

Назовите это так:

char binary_line[MAX_SPACE + 1]; 

while(!feof(file)){ 
    fgets(line,100,file); 
    hex_to_binary(line, binary_line); 
    printf("%s", binary_line); 
} 
0

изменение нравится:

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

char *hexstr_to_binstr(char *outbuff, const char *s); 

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

    while(fgets(line, sizeof(line), file)){ 
     puts(hexstr_to_binstr(binstr, line)); 
    } 
    fclose(file); 
    getchar(); 
    return 0; 
} 

const char *xdigit_to_binstr(char x){ 
    switch(x){ 
     case '0': return("0000"); 
     case '1': return("0001"); 
     case '2': return("0010"); 
     case '3': return("0011"); 
     case '4': return("0100"); 
     case '5': return("0101"); 
     case '6': return("0110"); 
     case '7': return("0111"); 
     case '8': return("1000"); 
     case '9': return("1001"); 
     case 'a': 
     case 'A': return("1010"); 
     case 'b': 
     case 'B': return("1011"); 
     case 'c': 
     case 'C': return("1100"); 
     case 'd': 
     case 'D': return("1101"); 
     case 'e': 
     case 'E': return("1110"); 
     case 'f': 
     case 'F': return("1111"); 
     default : return ""; 
    } 
    return NULL;//never reach this point 
} 
char *hexstr_to_binstr(char *outbuff, const char *s){ 
    char *p = outbuff; 

    for(; *s ; ++s){ 
     if(isxdigit(*s)){ 
      memcpy(p, xdigit_to_binstr(*s), 4); 
      p += 4; 
     } 
    } 
    *p = 0; 
    return outbuff; 
} 
Смежные вопросы