2015-09-16 4 views
-3

Я пытаюсь заставить эту функцию работать, она должна взять входную строку, а затем изменить ее на все строчные буквы, а затем избавиться от всех пробелов и знаков препинания, но я не могу ее получить работа ... У меня есть часть к концу, которая прокомментирована, и я не думаю, что она мне нужна, но я не могу сказать ... если кто-нибудь может понять, что эта помощь будет оценена!C++ Получение максимального палиндрома

bool PalindromeFinder::isPalindrome(string input) { 
//TODO define isPalindrome with the desired functionality 
// make new string without the spaces and special characters 
//isSpace and isPunct if space or thing then omit to make it a clean string 
//need to store largest palindrome so far that was found 

// make a string cleanString 
string cleanString = ""; 

//make the string all lowercase 
transform(input.begin(), input.end(), input.begin(), ::tolower); 

    for (int i=0; i <= input.length(); i++) { 
     char cha = input[cha]; 

     // now, if there is punctuation or a space, then remove it 
     if (ispunct(cha) || isspace(cha)) { 
      //remove the punctuation or space 
      input.erase(cha) == cleanString; 
     } 
    } 


//  for (int i=1; i <= input.length(); i++){ 
//   // check to make sure there are no spaces or punctuation 
//  if (!ispunct(cha) && !isspace(cha)) 
//  { 
//   //if there isnt then build the word...ex) e > ex > exa > exam 
//   input += cha; 
// 
//   //this line is for testing 
//   cout << "This is my clean string: " << input << endl; 
// 
//  } 
// 
// 
// } 


//make a empty string to use as a template 
    string revString = ""; 

// for all of the chars in the string, reverse them 
    for (int i = cleanString.length()-1; i >= 0; i--) 
    { 
     // use this to access array index 
     // add the letters back 
     revString += cleanString[i]; 
    } 

// now check and make sure that it equals each other... 
if (cleanString == revString) 
{ 
    // if it does, return true 
    return true; 
} 
    //otherwise return false 
else return false; 
} 
+0

Пожалуйста, опишите проблему. «получить самый большой палиндром» недостаточно. –

+0

"input.erase (cha) == cleanString" вы уверены, что хотите делать двойные равны здесь. –

+3

char cha = input [cha] ??? input.erase (cha) == cleanString; ??? Я думаю, это не настоящая копия/вставка вашего кода. –

ответ

0

Вы используете string.erase() неправильно.
Read at the documentation.

string.erase() ожидает либо итераторов или индексов.
Вы ошибочно даете ему символ, который продвигается до целого числа, а затем используется как индекс.

0

Вместо того чтобы записывать неисправные циклы, все, что вам нужно, это две функции для удаления символов и изменения строки.

Чтобы удалить символы из std::string, вы должны использовать std::remove_if:

input.erase(std::remove_if(input.begin(), input.end(), [](char c) 
          { return ::ispunct(c) || isspace(c);}), input.end()); 

Live Example

Аналогично, чтобы изменить строку, вы можете использовать std::reverse.

0

Сделайте буфер tmp размером вашей входной строки. Отслеживайте входную позицию символа в вашей строке ввода и выводите положение символа в вашем буфере вывода.

Это, как вы могли бы сделать это в C.

#include <string.h> // for size_t 
#include <ctype.h> // for isalnum 

// caller allocates output buffer large as large as input. 
// length could be a function parameter, since caller needs to know it anyway. 
size_t clean_string(char *out, const char* in) 
{ 
    size_t inpos=0, outpos=0; 
    while (in[inpos] != '\0') { 
     char c = in[inpos++]; 
     if (isalnum(c)) // <-- put in whatever logic you want here 
      out[outpos++] = c; 
    } 
    out[outpos] = '\0'; 
    return outpos; 
} 

Это мертвый простой, и только когда-либо копирует символ один раз. Это также легко читать и понимать. Есть хороший аргумент, который нужно сделать для классов строк C++, заботясь о том, чтобы вы никогда не забыли конечный '\0'.

Удаление символа в середине строки должно копировать все следующие символы за один. Вы стреляете в ногу с помощью C++, используя медленные операции, возможно, не понимая, потому что вы видите только вызов funcion input.erase(), а не цикл.