2015-05-09 74 views
-3

我很確定這是一個新手的錯誤,但我無法弄清楚。我試着製作一個迴文檢查器,但每當我嘗試將一個通過的字符數組拆分成一半時,它會在分割字符數組的末尾添加隨機(?)字符。我嘗試了谷歌搜索,但無濟於事。也許它與一個以null結尾的字符串有關,但是char數組的長度表明除了我傳遞的字符以外沒有其他字符。代碼在這裏:分裂字符數組增加(看似)隨機字符

#include <iostream> 

bool isPalindrome(char* passedString){ 
    int len = strlen(passedString); 
    char lh[len/2]; 
    char rh[len/2]; 

    std::cout << "Length is: " << len << std::endl; 

    if(len % 2 == 0){ 
    for(int i = 0; i < len/2; i++){ 
     lh[i] = passedString[i]; 
    } 

    int tmpCount = 0; 
    for(int i = len/2; i < len; i++){ 
     rh[tmpCount] = passedString[i]; 
     tmpCount++; 
     } 
    } 

    std::cout << "Left half: " << lh << std::endl << "Right half: " << rh << std::endl; 
    return 0; 
} 

int main(){ 
    isPalindrome("test"); 
    return 0; 
} 

返回此輸出編譯和執行後:

Length is: 4 
Left half: te�Y� 
Right half: st�Y� 
+0

'炭LH [len個/ 2]':運行時大小的數組是C99功能不可C++。使用'std :: string'來避免這種問題。 – 101010

回答

2

首先,字符串文字具有常量字符數組的類型。所以,如果你想調用傳遞給它一個字符串函數字面它必須聲明如下

bool isPalindrome(const char *passedString); 

其次還有在C中沒有變長數組++(儘管一些編譯器可以支持它們)。所以這些聲明

char lh[len/2]; 
char rh[len/2]; 

是無效的C++聲明。

這兩個字符數組不包含零終止的字符串。所以這個聲明

std::cout << "Left half: " << lh << std::endl << "Right half: " << rh << std::endl; 

可以輸出一些垃圾。

代替std::cout << lhstd::cout << rh使用

std::cout.write(lh, len/2); 

std::cout.write(rh, len/2); 

例如

std::cout << "Left half: "; 
std::cout.write(lh, len/2); 
std::cout << std::endl << "Right half: "; 
std::cout.write(rh, len/2) << std::endl; 
+0

感謝您的解釋!我零終止兩個字符數組,現在它工作正常。我的編譯器(g ++)確實給出了關於字符串文字轉換的警告,但沒有提及運行時大小的數組......有趣。 – user1910584

+0

@ user1910584此編譯器有自己的擴展名。警告取決於編譯器選項。 –