所以我正在制作一个无视任何空格或特殊字符的回文检查器。以下是我的功能的一部分。它的作用是将一个c字符串作为参数,然后我创建另一个c字符串,以便从orignal中删除空格和特殊字符。当我输出第二个c字符串时,它仍然会有空格或特殊字符。有人可以解释为什么这样做吗?感谢
bool isPalindrome(char *line)
{
//variables
bool palindrome = true;
int length = strlen(line);
int count = 0;
//copy line to line2 with no spaces and no punctuation
char *line2 = new char[length + 1];
int count2 = 0;
for(int i = 0; i < length; i++)
{
if(line[i] != ' ' && ispunct(line[i]) == false)
{
line2[count2] = line[i];
count2 ++;
}
}
for(int i = 0; i < count2; i++)
cout << line[i];
line2[length] = '\0';
答案 0 :(得分:1)
您以原始长度终止第二个字符串:
line2[length] = '\0';
应该是
line2[count2] = '\0';
就原始作业而言,没有必要创建字符串的副本来检查它是否是回文:你需要的只是一个函数,它找到下一个非空的非标点字符。具体方向:
int nextValidChar(const char *str, int &pos, const int step) {
pos += step;
while (pos >= 0 && str[pos] != '\0') {
char c = str[i];
if (c != ' ' && !ispunct(c)) {
return c;
}
pos += step;
}
return -1;
}
使用此功能,设置两个索引,零和length-1
,并重复调用nextValidChar
以查找两端的有效字符。
答案 1 :(得分:1)
它仍然输出空格和特殊字符的原因是因为这个
for(int i = 0; i < count2; i++)
cout << line[i];
应该是
for(int i = 0; i < count2; i++)
cout << line2[i];