【问题标题】:C++ Palindrome Bool Function (Using Pointer)C++ Palindrome Bool 函数(使用指针)
【发布时间】:2014-04-17 04:45:19
【问题描述】:

如何在 C++ 中创建回文函数?我正在使用 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;  
}

【问题讨论】:

  • 所以,在我阅读所有这些代码之前...您收到错误消息还是答案不正确?添加该细节,然后对其进行说明。如果是错误信息,请给它。如果不正确,请显示一些示例输入和输出。
  • 感谢您的回复。它给了我这个错误:线程 1:EXC_BAD_ACCESS(code=1.address=0x7fffSfc87000)
  • 当你设置 status = false 你应该打破循环(应该是一段时间,而不是一个 for one)因为如果中间 2 个字母相等,它返回 true,即使其他字母都是不同
  • 一般 cmets:1. 这不是 c++,2. 你的 reverse() 函数没有意义,3. 你在 isPalindrome() 函数中的循环不正确。您可以通过简单地从字符串的两端迭代检查两个字符是否相等来简化这一点。或者使用一些标准库算法(std::reverse()std::equal()
  • @hidrargyro 感谢您的解释。我做了一些测试,现在我明白了如何使用 status = false。

标签: c++ function boolean palindrome


【解决方案1】:

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

算法的工作原理如下:

获取字符串的长度;
从零循环到字符串长度 2;
将位置循环计数上的字符与长度减循环计数减 1 进行比较;
如果不相等,则不是回文;
如果循环结束,它是一个回文;

例如:“测试”:
第一步:比较 't' 和 't'
第二步:比较 'e' 和 's' --> 不是回文

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

试试这个:

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

【讨论】:

  • 给出代码的形式不好,为什么不描述解决方案呢? OP 显然是初学者...
  • 好的,对不起,我会解释的,给我几分钟,我的英语不太好:)
  • @linluk 你的代码很棒。在这部分: if(s[i]!=[l-i-1]) 您是否使用 -1 来引用 ('\0' 或空终止符)?
  • 因为字符串的第一个元素的索引为 0 而不是索引 1。所以字符串“test”的长度为 4,但最后一个字符 ('t') 的索引为 3。
【解决方案2】:

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

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

【讨论】:

  • 第二部分,如何在字符串的前后放置指针?
  • 反向函数的前三行已经在执行此操作。在该函数的第一个循环完成后,point 指向字符串的末尾。将其备份一步(就像您所做的那样),使其指向最后一个字符(或提前终止循环一次迭代)。
  • 非常感谢您的帮助。我现在明白了。
【解决方案3】:

类似于@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 前进,直到它们在中间相遇。如果它们指向彼此不同的字符,则测试失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    • 2018-09-12
    • 2012-04-03
    相关资源
    最近更新 更多