2013-08-30 58 views
2

我有一個很奇怪的問題。 即時通訊正在做的是即時通訊嘗試將字符串中的8位二進制數字轉換爲十進制數字(字符串也是) 在代碼結束時我輸出二進制字符串和十進制字符串,但是當我運行時,我只成功看到二進制字符串,但不是小數串...C++我不能cout一個字符串,而我成功cout另一個字符串

繼承人我的代碼:

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

using namespace std; 


void bintodec(string bin); 

int main() 
{ 
    string bin=""; 
    bintodec(bin); 
    return 0; 
} 

void bintodec(string bin) 
{ 
    int temp; 
    int temp_a; 
    int temp_b; 
    string dec; 

    cout << "Enter the binary number: "; 
    cin >> bin; 

    temp = 128*(bin[0]-48) + 64*(bin[1]-48) + 32*(bin[2]-48) + 16*(bin[3]-48) + 8*(bin[4]-48) + 4*(bin[5]-48) + 2*(bin[6]-48) + (bin[7]-48); 
    temp_a = temp%10; 
    temp = (temp - temp_a)/10; 
    temp_b = temp%10; 
    temp = (temp - temp_b)/10; 

    dec[2]=temp_a+48; 
    dec[1]=temp_b+48; 
    dec[0]=temp+48; 
    dec[3]='\0'; 

    cout << endl << bin << " in decimal is: " << dec << endl; 
} 

,這裏是運行結果:

輸入的二進制數:10101010

10101010十進制是:

「is」後應該有我的十進制數;然而,什麼都沒有。我試圖cout dec [0] dec [1]和dec [2]單獨和它的工作,但是當我cout整個dec,我每次都失敗...

有誰能告訴我我的問題在哪裏?我認爲我的代碼出了問題,但我可以弄明白...

+2

在盲目開始寫入不存在的元素之前,您是否考慮過爲'dec'字符串分配*空格*?一個簡單的'push_back()'調用正確的順序可以解決你的問題(我不建議解決這個問題,因爲你已經編寫了它,但這不是問題的關鍵)。 – WhozCraig

+4

'dec.length()'爲零。對dec [N]的所有賦值都是緩衝區溢出,表現出未定義的行爲。 –

+1

爲什麼你的函數需要一個參數,按值,然後在使用該值之前覆蓋它? –

回答

4

dec的大小爲零。但是,通過使用

string dec(4, ' '); // fill constructor, creates a string consisting of 4 spaces 

代替

string dec; 

訪問在位置爲0〜3 元素例如,您可以創建dec初始化到合適的大小。

+0

非常感謝!那真的解決了我的問題。即時通訊新的字符串,在此之前,我甚至不知道如何定義字符串的大小...我總是使用字符數組之前... –

0

注意:這只是一個註釋代碼而不是實際答案。

int main() 
{ 
    string bin=""; 
    decode(bin); 
} 

void decode(string bin) 
{ 
} 

這會導致在輸入「decode」時創建一個新字符串,並將「bin」的內容複製到該字符串中。在解碼結束時,對主體不可見的任何對decode :: bin的更改都將被隱藏。

你能避免這一點 - 被稱爲「按值傳遞」,因爲你逝去的「倉」的價值觀,而不是「bin」的本身 - 通過使用「按引用傳遞」

void decode(string& bin) 

但在你的代碼,你實際上並不需要通過「bin」。如果你將需要在主「bin」的解碼後,你可能會改爲考慮返回它:

int main() 
{ 
    string bin = decode(); 
} 

string decode() 
{ 
    string bin = ""; 

    ... 

    return bin; 
} 

但現在,距離主刪除bin,並在解碼的局部變量。

void bintodec(); 

int main() 
{ 
    bintodec(); 
    return 0; 
} 

void bintodec() 
{ 
      std::string bin = ""; 
    cout << "Enter the binary number: "; 
    cin >> bin; 

    int temp = 128*(bin[0]-48) + 64*(bin[1]-48) + 32*(bin[2]-48) + 16*(bin[3]-48) + 8*(bin[4]-48) + 4*(bin[5]-48) + 2*(bin[6]-48) + (bin[7]-48); 
    int temp_a = temp%10; 
    temp = (temp - temp_a)/10; 
    int temp_b = temp%10; 
    temp = (temp - temp_b)/10; 

      char dec[4] = ""; 
    dec[2] = temp_a+48; 
    dec[1] = temp_b+48; 
    dec[0] = temp+48; 
    dec[3] = '\0'; 

    cout << endl << bin << " in decimal is: " << dec << endl; 
} 
1

@SebastianK已經處理了您的std::string長度爲零的事實。我想補充一點,不要使用以下:

dec.push_back(temp + '0'); 
dec.push_back(temp_b + '0'); 
dec.push_back(temp_a + '0'); 

請注意,您不必爲NULL終止:

dec[2]=temp_a+48; 
dec[1]=temp_b+48; 
dec[0]=temp+48; 
dec[3]='\0'; 

可以使用push_back()成員函數追加字符爲空std::string一個std::string和我用字符文字'0'而不是ASCII值48,因爲我認爲它更清晰。

相關問題