2014-03-12 45 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前进,直到它们在中间相遇。如果他们指出彼此不同的角色,测试就会失败。