2016-12-06 41 views
3

實際上,我工作的一個C++字符串反轉/字符[]的方法C++做它想要的東西|的char [] cout和倒置的char []

#include <iostream> 

using namespace std; 

void inverse(string input) 
{ 
    int length = input.length(); 
    char* output = new char[length]; 

    for(int i = 0; i < length; i++) 
    { 
     output[length - (i + 1)] = input[i]; 
    } 

    cout << output << endl; 
    delete output; 
} 

int main(int argc, char *argv[]) 
{ 
    while(true) 
    { 
     string in; 
     cin >> in; 
     inverse(in); 
    } 

    return 0; 
} 

的問題是,當我輸入一個字符串3/5/7等如果它是正確的,但是如果我輸入一個字符串長度爲2/4/6等等字符那裏反轉字符串在他和和只有當我輸入這些長度的數字時有隨機字符。

我很困惑,因爲這個錯誤只出現在偶數。

這裏有一個小例子: Here's a little example:

下面是新的代碼(一切正常這裏),我知道它有話對數組的末尾做的/ 0,但爲什麼只有偶數。

#include <iostream> 

using namespace std; 

void inverse(string input) 
{ 
    int length = input.length(); 
    char* output = new char[length + 1]; 

    for(int i = 0; i < length; i++) 
    { 
     output[length - (i + 1)] = input[i]; 
    } 

    output[length] = '\0'; 
    cout << output << endl; 
    delete output; 
} 

int main(int argc, char *argv[]) 
{ 
    while(true) 
    { 
     string in; 
     cin >> in; 
     inverse(in); 
    } 

    return 0; 
} 

任何人都可以幫我找到解決方案嗎?

+1

對於初學者來說,你錯過的#include''。另外:查找['std :: reverse'](http://en.cppreference.com/w/cpp/algorithm/reverse)。 – rubenvb

+1

爲什麼'字符*輸出=新的char [長度+ 1];'代替'的std :: string輸出(長度+ 1,0);',你已經採取了'的std :: string'作爲參數。 –

+0

我同意Ralph Tandetzky答案。 我注意到你的應用程序中存在內存泄漏,你需要刪除整個數組。 所以'刪除輸出;'應該'刪除[]輸出' –

回答

3

您的字符串不是空終止的。嘗試

void inverse(string input) 
{ 
    reverse(input.begin(), input.end()); 
    cout << input << endl; 
} 

對於這個工作,你需要包括algorithm頭定義了std::reverse()功能。

它並不適用於偶數工作的原因可能是這樣的事實,即內存分配通常保留多一點內存,所以內存邊界正確對齊。因此,湊到偶數不是浪費。這只是一個猜測。不過,我強烈建議您避免未定義的行爲。

0

你的字符串末尾有垃圾,因爲它沒有以\0結尾。在C++中打印這樣的字符串是未定義的行爲。

你真是幸運,你的代碼工作了很長時間。例如,在我的機器上,它適用於1,2,3,5,6,7和8的長度以及打印4的垃圾。

上一個:其實,儘量避免UB:C++標準沒有說明當你有UB時會發生什麼 - 理論上,你的程序可能會崩潰,或者你的電腦可能會爆炸,或者惡魔可能從你的鼻子出現。在這種特殊情況下,如果您由於某種原因不能使用std::reverse或手動完成所有工作,則建議使用std::string作爲output的容器。