2017-01-20 2 views
1

У меня есть функция bin2hexStr(), которая преобразует двоичную строку в шестую строку. При тестировании он выдает мою программу при вызове «в последний раз». Это успешно для многих вызовов функций с меньшими входами, проверенными до этого примера. Но я не уверен, почему здесь это не удается. Кроме того, если вы удалите Case 9 снизу, она не будет выполнена на случай 8, где он будет проходить, если выполняется как ниже:Возвращающий указатель из программы сбоев с внешней связью

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

char bin2hexChar(char*); 
int string_compare(char*, char*); 
char* bin2hexStr(char*); 

int main(void) { 

    char* bin7 = "101110101111110000110001110010110011110100110101110110"; 
    char* bin25 = "100111010011101101011100111100011010111001000110100001101010"; 

    printf("Case 8: 101110101111110000110001110010110011110100110101110110 (54 bits):\n"); 
    printf("Expected Result: 2EBF0C72CF4D76\n"); 
    printf("Actual Result: %s\n\n", bin2hexStr(bin7)); 

    printf("Case 9: 100111010011101101011100111100011010111001000110100001101010 (60 bits):\n"); 
    printf("Expected Result: 9D3B5CF1AE4686A\n"); 
    printf("Actual Result: %s\n\n", bin2hexStr(bin25)); 

} 

char* bin2hexStr(char* binStr) { 

    char *paddedBin; 
    int i,r; 
    size_t loops; 

    int count = 0; 
    r = 4-strlen(binStr)%4; 
    if(r!=4){ 
     loops = (strlen(binStr)+r)/4; 
     paddedBin = (char *)malloc((loops+1)*sizeof(char)); 
     for(int j=0; j<r;++j) 
      paddedBin[j] = '0'; 
     memcpy(paddedBin,&buffer[4-r],r); 
     memcpy(&paddedBin[r],binStr,strlen(binStr)+1); 
    }else{ 
     loops = ceil(strlen(binStr)/4); 
     paddedBin = (char *)malloc((loops+1)*sizeof(char)); 
     memcpy(paddedBin,binStr,strlen(binStr)+1); 
    } 
    printf("Printing value of r (zeros to pad): %d\n", r); 
    char *hexStr = (char *)malloc((loops)*sizeof(char)); 
    for(i=0;i<(int)loops;i++){ 
     char *quartet = (char *)malloc((5)*sizeof(char)); 
     ++count; 
     memcpy(quartet,&paddedBin[4*i],4); 
     quartet[4]='\0'; 
     hexStr[i] = bin2hexChar(quartet); 
     free(quartet); 
    } 

    hexStr[loops] = '\0'; 
    printf("Printing hex converted string: %s\n", hexStr); 
    free(paddedBin); 
    return hexStr; 
} 

char bin2hexChar(char* bin){ 

    static char hex_table[] = {'0', '1', '2', '3', '4', '5', '6', '7', 
          '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; 
    static char bin_table[16][5] = {"0000", "0001", "0010", "0011", "0100", 
           "0101","0110", "0111", "1000", "1001", 
           "1010", "1011", "1100", "1101", "1110", 
           "1111"}; 

    int i; 
    int k = 16; 
    char hex; 

    for(i=0;i<k;i++){ 
     if (string_compare(bin,bin_table[i])==1) { 
      hex = hex_table[i]; 
      break; 
     } 
    } 
    return hex; 
} 

int string_compare(char str1[], char str2[]) 
{ 
    int ctr=0; 

    while(str1[ctr]==str2[ctr]) 
    { 
     if(str1[ctr]=='\0'||str2[ctr]=='\0') 
      break; 
     ctr++; 
    } 
    if(str1[ctr]=='\0' && str2[ctr]=='\0') 
     return 1; 
    else 
     return 0; 
} 

Обычно у меня есть функции в отдельный файл и ссылку внешне, но у меня есть изменил это, чтобы представить пример минимального, полного, проверяемого.

Может ли кто-нибудь помочь?

РЕДАКТИРОВАТЬ: при более отладочной работе возникает интересное поведение при комментировании бесплатно (paddedBin). Если free (paddedBin) остается без комментирования, он не возвращается после возврата hexStr, как описано. Если прокомментирован свободный (paddedBin), он не работает при создании квартета для шестнадцатеричного преобразования в цикле for. Умение ошеломляет.

+0

Это довольно трудно, чтобы помочь вам, если вы не обеспечивают [mcve], которая воспроизводит эту проблему. Вы пробовали использовать [valgrind] (http://valgrind.org), чтобы узнать, есть ли у вас какие-либо проблемы для вас? – kaylum

+0

функции являются автоматическими extern в c, вам не нужно делать это extern char bin2hexChar (char *); просто удалите extern из прототипа функции –

+0

@kaylum Я представил пример минимального, полного и проверяемого. Мне бы очень хотелось, если бы вы могли мне помочь. – Matt

ответ

1

исправить и сократить как это (проверка ошибок опущена)

char *bin2hexStr(const char *binStr){ 
    size_t loops, len = strlen(binStr); 
    int r = len % 4; 
    if(r) 
     r = 4 - r; 

    char *paddedBin = malloc(len + r + 1);//+1 for null-terminator 
    memset(paddedBin, '0', r);//add padding to top 
    memcpy(paddedBin + r, binStr, len + 1); 
    loops = (len + r)/4; 
    char *hexStr = malloc(loops + 1);//+1 for NUL 
    for(size_t i = 0; i < loops; i++){ 
     hexStr[i] = bin2hexChar(paddedBin + i * 4); 
    } 
    hexStr[loops] = '\0'; 
    free(paddedBin); 
    return hexStr; 
} 

char bin2hexChar(const char *bin){ 
    static char hex_table[] = {'0', '1', '2', '3', '4', '5', '6', '7', 
          '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; 
    int k = 0; 
    for(int i = 0; i < 4; i++){ 
     k = k * 2 + *bin++ - '0';//calculate index 
    } 
    return hex_table[k]; 
} 
+0

Не могли бы вы объяснить это решение? Когда я копирую и вставляю его в функции в своем сообщении, да, это работает. Однако, когда я заменяю содержимое своих файлов функций для каждой связанной извне функции, результат равен нулю. Спасибо за вашу помощь. – Matt

+0

@Matt Заменить прототип 'char bin2hexChar (const char *); char * bin2hexStr (const char *); 'Я думаю, что есть проблема с вашим кодом. – BLUEPIXY

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