поэтому я делаю палиндром, который игнорирует любое пробел или специальные символы. Ниже приведена часть моей функции. Что он делает, так это то, что в качестве аргумента требуется строка ac string, затем я создаю другую строку 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';
Причина, по которой он все еще выводится с пробелами и специальными символами, состоит в том, что это
for(int i = 0; i < count2; i++)
cout << line[i];
должно быть
for(int i = 0; i < count2; i++)
cout << line2[i];
Вы теряете нулевую вторую строку на исходной длине:
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;
}
С помощью этой функции nextValidChar
два индекса в нуле и length-1
и вызовите nextValidChar
несколько раз, чтобы найти действительные символы с обоих концов.