2014-03-12 48 views
2

如何在C++中創建Palindrome函數?我使用了2種函數類型(bool和void)。 這是我的代碼到目前爲止(我真的很感激任何幫助,爲什麼我的代碼不工作?)謝謝!C++ Palindrome布爾函數(使用指針)

#include <iostream> 
#include <cctype> 
#include <cstdlib> 
#include <string> 
using namespace std; 


void reverse(char *); 
bool isPalindrome(char *); 

int main() 
{ 
    char a[10]; 
    cout << "string "; 
    cin.getline(a, 10); 
    if (palindrome(a)) 
     cout << "true"; 
    else 
     cout << "false"; 
    return 0; 
} 
void reverse(char *s) 
{ 
    char *point = s; 
    int i, min; 
    for (i = 0; *point != '\0'; i++) 
     point++; 
     min = i; 
     point--; 
    for (i = min; i > 0; i--) 
    { 
     cout << *point--; 
    } 
} 
bool ispalindrome(char *s) 
{ 
    bool status; 
    char *original = s; 
    char *point = s; 
    reverse(point);   
    for (int i = 0; point != '\0'; i++) 
    { 
     if (point[i] == original[i]) 
     status = true; 
     else 
     status = false; 
    } 
    return status; 
} 
+2

因此,在我閱讀所有這些代碼之前......您是否收到錯誤消息或答案不正確?添加該細節,然後對其進行闡述。如果這是一個錯誤信息,請給它。如果它不正確,請顯示一些示例輸入和輸出。 – Segfault

+0

感謝您的回覆。它給了我這個錯誤:線程1:EXC_BAD_ACCESS(代碼= 1。地址= 0x7fffSfc87000) – ptaal

+0

當你設置status = false你應該打破循環(應該是一段時間,而不是一個),因爲如果中間的2個字母是等於它返回true,即使其他字母都是不同的 – hidrargyro

回答

2

你不需要扭轉字符串來檢查它的迴文。

該算法的工作原理是:

獲取字符串的長度;
從零到字符串的長度循環2;
比較位置循環計數與長度減去循環計數減1的字符;
如果不等於它不是迴文;
其迴文如果循環完成;

例如: 「測試」:
第一步:與比較 'T' 'T'
第二步驟:比較 'E' 與 'S' - >不是迴文

例如「 PALAP「:
第一步:比較 'p' 與 'p'
第二步:比較 'A' 與 '一'
第三步:比較 'L' 與 'L'
現在我們知道,這是一個迴文。

嘗試thisone:

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

int palindrom(char * s){ 
    int i; 
    int l = strlen(s); 
    for(i=0;i<=l/2;i++) 
    if(s[i]!=s[l-i-1]) return 0; 
    return 1; 
} 

int main(void) { 
    char * test = "test"; 
    char * pal = "palap"; 
    printf("%s %d", test, palindrom(test)); 
    printf("%s %d", pal, palindrom(pal)); 
    return 0; 
} 
+0

給代碼是不好的形式,爲什麼不描述解決方案?該OP顯然是一個初學者... – Nim

+0

好吧,對不起,我會解釋它,只給我幾分鐘,我的英文不完美:) – linluk

+0

@linluk你的代碼是偉大的。在這部分:if(s [i]!= [l-i-1])是否在引用('\ 0'或null終止符)時使用-1? – ptaal

2

這裏有幾件事情可以改進。你最直接的問題是你的isPalindrome函數中的for循環沒有終止。將終止條件更改爲point[i] != '\0'

其次,反轉函數實際上並沒有逆轉。如果你想使用這個算法,你需要爲反向字符串分配內存。儘管如此,更好的方法是在字符串的前端放置一個指針,在該字符串的末尾放置一個指針,然後將它們放到字符串的中間。

+0

對於第二部分,我如何在字符串的前端和末尾添加指針? – ptaal

+0

你的反向函數的前三行已經這樣做了。在該函數的第一個循環結束後,「point」指向字符串的結尾。支持一步(就像你一樣),所以它指向最後一個字符(或者提前一個迭代終止循環)。 – Segfault

+0

非常感謝您的幫助。我現在明白了。 – ptaal

2

從使用@linluk指針而不是指數的答案類似...

#include <cstring> 
bool palindrome(char *s) 
{ 
    for (char *e = strchr(s, '\0'); -- e > s; ++ s) 
     if (*e != *s) 
      return false; 
    return true; 
} 

最初,e,指向字符串和s點結束到開始。在每次迭代中,e後退一步,而s前進,直到它們在中間相遇。如果他們指出彼此不同的角色,測試就會失敗。