我试图让这个函数工作,它应该采取输入字符串,然后将其更改为全部小写,然后摆脱所有的空格和标点符号,但我不能让它工作...我有一部分在结束时被注释掉,我不认为我需要它,但我不知道......如果有人对这个帮助有任何见解将不胜感激!
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)
您错误地使用了string.erase()
Read at the documentation.
string.erase()
要求迭代器或索引。
你错误地给它一个char,它被提升为一个整数然后用作索引。
答案 1 :(得分:0)
不是编写错误的循环,而是需要两个函数来删除字符和反转字符串。
要删除std::string
中的字符,您应该使用std::remove_if:
input.erase(std::remove_if(input.begin(), input.end(), [](char c)
{ return ::ispunct(c) || isspace(c);}), input.end());
同样,要反转字符串,您可以使用std::reverse。
答案 2 :(得分: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 ++来拍摄自己,可能没有意识到,因为你只看到input.erase()
函数调用,而不是循环。