2014-12-31 27 views
0

我幾乎解決了這個練習: 二進制到十進制和後退轉換器 - 「開發一個轉換爲十進制數轉換爲二進制或二進制數的十進制數。」 因此,二進制到十進制轉換器完美工作,但另一個沒有。 convertToBinary()函數返回廢話,我不知道爲什麼。下面是代碼:C++二進制到十進制和背靠背換流

#include <iostream> 
#include <cstring> 
#include <cmath> 
using namespace std; 

char* convertToBinary(int dec); 
int convertToDec(const char* bin); 

int main() 
{ 
    std::cout << convertToBinary(100) << std::endl; // wtf! 
    return 0; 
} 

char* convertToBinary(int dec) 
{ 
    char binary[15] = ""; 
    int result; 
    for(int i = 0; dec >= 1; dec /= 2, ++i) 
    { 
     result = !((dec % 2) == 0); 
     binary[i] = result + 48; 
    } 
    for(int i = strlen(binary); strlen(binary) % 4 != 0; ++i) // add some zeros to make it look cool 
     binary[i] = '0'; 
    for(int i = 0, j = strlen(binary)-1; i < j; ++i, --j) // reverse the array 
    { 
     char temp = binary[i]; 
     binary[i] = binary[j]; 
     binary[j] = temp; 
    } 
    std::cout << binary << std::endl; // looking good! 
    return binary; 
} 

int convertToDec(const char* bin) 
{ 
    int dec = 0; 
    int size = strlen(bin); 
    for(int i = 0; *bin; ++i, ++bin) 
    { 
     int ch = *bin - 48; 
     dec += ch * pow(2, size - i - 1); 
    } 
    return dec; 
} 
+0

您不允許使用'按位operators'? –

+3

垃圾來自返回本地數組,'二進制'的地址。你應該使用'std :: string'而不是char數組,否則你應該在堆上分配char數組。 –

+1

而且還使用編譯器警告,你會知道這一點。 –

回答

0

用C語言

char *convertToBinary(int value) 
{ 
    char *binary; 
    size_t length; 
    size_t i; 

    length = 8 * sizeof(value); 
    binary = malloc(1 + length); 
    if (binary == NULL) 
     return NULL; 
    for (i = 0 ; i < length ; ++i) 
     binary[length - i - 1] = (value & (1 << i)) ? '1' : '0'; 
    binary[length] = '\0'; 

    return binary; 
} 

int binaryToDecimal(const char *binary) 
{ 
    int value; 
    size_t length; 
    size_t i; 

    value = 0; 
    length = strlen(binary); 

    for (i = 0 ; i < length ; i++) 
     value |= (binary[i] == '1') ? (1 << (length - i - 1)) : 0; 
    return value; 
} 

用C++語言

std::string convertToBinary(int value) 
{ 
    std::string binary; 
    size_t  length; 

    length = 8 * sizeof(value); 

    binary.resize(length); 
    for (size_t i = 0 ; i < length ; ++i) 
     binary[length - i - 1] = (value & (1 << i)) ? '1' : '0'; 
    return binary; 
} 

int binaryToDecimal(const std::string &binary) 
{ 
    int value; 
    size_t length; 

    value = 0; 
    length = binary.length(); 

    for (size_t i = 0 ; i < length ; i++) 
     value |= (binary[i] == '1') ? (1 << (length - i - 1)) : 0; 
    return value; 
} 

從二進制轉換爲十進制,您可以使用,當然strtol

你的錯誤是返回一個局部變量,局部變量自動函數返回時,因此垃圾你得到了釋放。

0

當你做這樣的事情:

char *toString(...) 
{ 
    char res[MAX_RES]; 

    // fill res 
    return res; 
} 

創建數組res爲堆棧上的本地陣列。從函數返回時,此數組超出範圍;一個指向這個數組的指針不再有效,並且很可能會指向垃圾。

如果你想用C風格的char緩衝區,有兩種方法來解決這個問題:

在堆上分配的結果。

char *toString(...) 
{ 
    char *res = malloc(MAX_RES); 

    // fill res 
    return res; 
} 

malloc在堆中分配的數據將是有效的,直到有明確free發佈。這種方法的優點是您可以根據需要製作字符串。退款是分配可能失敗。這也是值得注意的是,來電者現在擁有的字符串,並負責free荷蘭國際集團它:

char *x = toString(...); 

// do stuff with x 
free(x); 

**傳緩衝區和最大長度**

int toString(char *res, size_t max, ...) 
{ 
    // fill res 
} 

這是許多方法庫功能使用,特別是snprintf。調用者必須提供他們自己的緩衝區和最大允許長度的信息,以避免緩衝區溢出。這種方法必須跟蹤緩衝區大小並在必要時截斷結果,可能會維持字符串以null結尾。這些函數可能是void,但通常返回實際字符​​串長度或-1作爲錯誤指示符。

它被稱爲是這樣的:

char x[200]; 

toString(x, sizeof(x), ...); 
// do stuff with x 
相關問題