Palindrome finder:非字母数字字符删除问题

时间:2014-07-03 07:30:16

标签: c++ palindrome

所以我在使用这一段代码时遇到了很多麻烦。我已将整个程序包含在上下文中,但我的问题在于cleanUp函数,其中我(尝试)删除所有不是'A'到'Z'的字符。

任何提示?

#include <iostream>
#include <cstdlib>
#include <string>
#include <stdio.h>
#include <ctype.h>

using namespace std;

bool again(string title);               // Checks if you want to run again.
void makeUpper(char word[]);
void getReverse(char word[], char reversed[]);
char * find(char *str, char what);
bool equal(char word[], char reversed[]);
int size(char word[]);
char * cleanUp(char *str);

int main()
{
    char word[256] = "Hello?? There!", reversedWord[256];
    do
    {
        cout<<"Please enter the string to check: ";
        makeUpper(word);
        cout << word;
        cleanUp(word);
        getReverse(word,reversedWord);
        if(equal(word, reversedWord))
            cout<<"You have a palindrome!"<<endl;
        else
            cout<<"You do not have a palindrome!"<<endl;

    } while(again("Do you want to do this again? "));
    return 0;
}

bool again(string title)
{
    string answer;
    cout<<endl<<title;
    getline(cin,answer);
    return toupper(answer[0]) == 'Y';
}


void makeUpper(char word[])
{
    char *ptr = word;
    while (*ptr) {
        *ptr = toupper(*ptr);
        ptr++;
    }
    cout << "In uppercase:: " << word << endl;
}

char * cleanUp(char * astrid)
{
    char *new_astrid;
    for (*astrid; *astrid != '\0'; astrid++)
    {
        cout << "First loop";
        if (isalpha(*astrid))
        {
            *new_astrid = *astrid;
            new_astrid = ++new_astrid;
            cout << "Here!";
        }
    }
    cout << *new_astrid;
    return *new_astrid;
}



void getReverse(char word[], char reversed[])
{
    char *ptr_ind = find(word, '\0'), *ptr_ind_2 = reversed;
    while(ptr_ind != word-1)
    {
        *ptr_ind_2 = *ptr_ind;
        ptr_ind--;
        ptr_ind_2++;
    }
    *ptr_ind_2 = '\0';
}

char * find(char *str, char what)
{
    char *ptr = str;
    while(*ptr != what && *ptr != '\0')
        ptr++;
    return *ptr == what ? ptr : NULL;
}

bool equal(char word[], char reverse[])
{
    int total;
    char * ptr;
    ptr = word;
    if((total = size(word)) != size(reverse))
        return false;
    for(char * ptr2 = reverse;  *ptr != '\0' && *ptr == *ptr2; ptr++, ptr2++);
    return *ptr == '\0';
}

int size(char word[])
{
    int total = 0;
    char * ptr = word;
    while(*ptr != '\0')        //while(!ptr)
    {
        ptr++;
        total++;
    }
    return total;
}

1 个答案:

答案 0 :(得分:1)

您的代码中存在多个错误。

new_astrid未初始化,当您调用*new_astrid = *astrid时,您尝试将字符复制到未初始化的内存,这会使程序崩溃。 您还会将解除引用的指针返回new_astrid,但cleanUp的函数原型表示您返回pointer to char

您应该使用new_astrid初始化new char[strlen(astrid)]。但是,因为你增加了指针(new_astid = ++new_astrid),你的代码将导致内存泄漏。所以你应该先存储指针,以便以后删除它。

我建议您使用std::strings

,而不是使用原始指针

我对回文测试仪的建议是:

#include <iostream>
#include <string>
#include <locale>

bool isPalindrome(std::string word)
{
    std::locale loc;
    for (std::string::size_type i = 0; i < word.length() / 2 + 1; ++i)
    {
        if (std::toupper(word[i],loc) != std::toupper(word[word.length() - i - 1],loc))
        {
            return false;
        }
    }

    return true;
}

int main(int , char **)
{
    std::string str = "Abba";

    //Remove all non alpha values from string
    str.erase(std::remove_if(str.begin(), str.end(), [](char const c){return !std::isalpha(c);}), str.end());

    if (isPalindrome(str) == false)
    {
        std::cout << str << " is no palindrome" << std::endl;
    }
    else 
    {
        std::cout << str << " is a palindrome" << std::endl;
    }

    return 0;
}

字符串中非alpha值的删除来自this问题。