2017-09-30 57 views
-1

我想創建函數,根據輸入是否是迴文返回true/false,當給出abcddcba或aba它不給出真實的,但它應該。 PLZ幫助C++迴文不工作

bool checkPalindrome(char input[],int p=0) { 
    if(input[1]=='\0'){ 
     return true; 
    } 
    if(sizeof(input)%2==0) { 
     int a = sizeof(input); 
     for(int i=0;i<(a/2);i++) { 
      if(input[0+i]==input[a-i-2]){ 
       p++; 
      } 
     } 
     if(p==a/2){ 
      return true; 
     } else{ 
      return false; 
     } 
    } 
    else{ 
     int a = sizeof(input); 
     for(int i=0;i<((a-1)/2);i++) 
     { 
      if(input[0+i]==input[a-i-2]){ 
       p++; 
      } 
     } 
     if(p==(a-1)/2){ 
      return true; 
     } else{ 
      return false; 
     } 
    } 
} 
+4

如果您以前從未使用調試器,現在是時候學習如何使用一個完美的時間。使用調試器,您可以在監控變量及其值的同時逐行執行代碼。我還建議你花一些時間閱讀Eric Lippert的[如何調試小程序](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。如果(S [i]!= S [S]),則sizeof(input)將返回sizeof(char *)' –

+2

size() - 1 - i]){ return false; } } return true; –

+0

'(int i = 0; i Taz742

回答

1

您的代碼太長。有一種簡單的方法:在字符串元素上迭代一次,比較n-1與0和n-2與1,依此類推。

如果兩個字符不相同的回報,否則爲false繼續檢查:

bool checkPalindrome(char* str) { 
    const int size = strlen(str); 
    for(int i(0), j(size) - 1); i < size/2; i++, j--) 
     if(str[i] != str[j]) 
      return false; 
    return true; 
} 

int main(){ 

    char* str = "level"; 
    cout << checkPalindrome(str); 

    cout << endl << endl; 
    return 0; 
} 
+0

對於在for循環的每次迭代中調用'strlen',您都會受到性能損失。您也可以根據需要進行兩次比較。 – selbie

+0

@selbie:我編輯它。 –

+0

不錯!但是,如果這是一個C++問題,並且如果我們在2017年,有人可以解釋爲什麼我們不使用'string'但仍然使用char *'嗎? – Christophe

3

C++風格:

bool checkPalindrome(const std::string& str) 
{ 
    size_t len = str.size(); 
    for (size_t i = 0; i < len/2; i++) 
    { 
     if (str[i] != str[len-1-i]) 
      return false; 
    } 
    return true; 
} 

風格:

bool checkPalindrome(const char* str) 
{ 
    size_t len = str ? strlen(str) : 0; 
    for (size_t i = 0; i < len/2; i++) 
    { 
     if (str[i] != str[len-1-i]) 
      return false; 
    } 
    return true; 
} 

在這兩種情況下,你可能需要評估(問)是否應該將空字符串視爲迴文。

0

C++版本的基礎上串和迭代器(僅適用於完整起見,其他的答案已經非常不錯):

bool checkPalindrome(const string& str) { 
    for (auto p = str.begin(),q = str.end(); p!=q && p!=q+1; p++) 
     if (*p!=*--q)  // if char from front doesn't match char from rear ? 
      return false; // then it's not a palindrome ! 
    return true; 
} 

說明:迭代p開始在的前面字符串和q在後面(在最後一個字符之後)。 p將前進,q將倒退。如果p達到q或如果p已通過q(特殊情況下,如果該詞具有均勻長度),則結束,我們可以得出迴文。但是如果之前,p的char和q之前的char之間有任何區別,它不是迴文。

Online demo, with little test suite