C ++ Palindrome Bool函数(使用指针)

时间:2014-03-12 19:27:02

标签: c++ function boolean palindrome

如何在C ++中创建Palindrome函数?我正在使用2种函数类型(bool和void)。 这是我的代码到目前为止(我真的很感激任何帮助,为什么我的代码不工作?)谢谢!

#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;  
}

3 个答案:

答案 0 :(得分:2)

这里可以改进几件事。您最直接的问题是isPalindrome函数中的for循环不会终止。将终止条件更改为point[i] != '\0'

其次,反向功能实际上并没有倒转。如果你想使用这个算法,你需要为反向字符串分配内存。更好的方法是将指针放在字符串的前面,指针放在字符串的末尾,然后将它们移到字符串的中间。

答案 1 :(得分:2)

你不需要反转字符串来检查它的回文。

该算法的工作方式如下:

获取字符串的长度;
从0到字符串的长度循环2;
比较位置循环计数中的字符与长度减去循环计数减1;
如果不相等则不是palindrom;
如果循环结束,它就是一个回文;

例如:“test”:
第一步:将't'与't'进行比较 第二步:将'e'与's'进行比较 - &gt;不是回文

例如“palap”:
第一步:将'p'与'p'进行比较 第二步:将'a'与'a'进行比较 第三步:将'l'与'l'进行比较 现在我们知道它是一个palindrom。

试试这个:

#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; 
}

答案 2 :(得分: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向前迈进,直到它们在中间相遇。如果他们指向彼此不同的角色,则测试失败。