Как убрать пробелы и проверить, является ли строка палиндромом?
В вашем вопросе две части: (1)" Как убрать пробелы "?и (2) [Как] " проверить, является ли строка палиндромом? ".Вы должны подойти к проблеме в два отдельных шага.
Удаление пробелов из строки можно сделать одним из двух способов: (1) удалить пробелы на месте в исходной строке (предполагается, что ваш оригинал является изменяемой строкой, а не String Literal ) или (2) удаляет пробелы при заполнении второй строки непробельными символами из первой, сохраняя первую строкубез изменений (работает независимо от того, является ли оригинал изменяемым).Ваш самый безопасный выбор - последний.
Простая функция, которая предоставляет буферы источника и назначения в качестве параметров функции для удаления пробелов, может быть простой:
void removespace (char *dest, const char *src)
{
size_t n = 0;
while (*src) {
if (!isspace(*src))
dest[n++] = *src;
src++;
}
dest[n] = *src; /* nul-terminate */
}
Переход ко второмучасть вашей проблемы, если у вас возникают проблемы, когда вы поворачиваете голову, используя указатели start и end , чтобы перебирать концы строки до середины, чтобы проверить, является ли строкаПалиндром, вы можете сделать то же самое со строковыми индексами.Кроме того, всякий раз, когда вам нужно проверить, является ли что-то пробелом или преобразовать регистр символов, используйте макросы isspace()
или tolower() / toupper()
, предоставленные в ctype.h
.(в противном случае ВЫ несете ответственность за ВСЕ необходимые условные проверки)
Простая реализация checkpalindrome()
с использованием строковых индексов может выглядеть так:
int checkpalindrome (const char *s)
{
size_t n = 0, len = strlen (s);
while (len-- > n) /* loop over each start/end lowercase char */
if (tolower (s[n++]) != tolower (s[len]))
return 0;
return 1;
}
Теперь в вашей реализации main()
чтение вашей строкиот пользователя Никогда, никогда, никогда не используйте gets()
.Он настолько небезопасен и подвержен переполнению буфера, что был удален из стандартной библиотеки в C11.Смотрите Почему get () настолько опасен, что его никогда не следует использовать! .Просто используйте fgets()
вместо этого и обрежьте конец строки из буфера, заполненного fgets
, переписав конец строки символом nul-terminating .(strcspn()
удобно для этого).
Если положить его целиком (и использовать ваш троичный для управления выводом "is"
или "is not"
), вы можете сделать:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAXC 1024 /* if you need a constant, define one (or more) */
void removespace (char *dest, const char *src)
{
size_t n = 0;
while (*src) {
if (!isspace(*src))
dest[n++] = *src;
src++;
}
dest[n] = *src; /* nul-terminate */
}
int checkpalindrome (const char *s)
{
size_t n = 0, len = strlen (s);
while (len-- > n) /* loop over each start/end lowercase char */
if (tolower (s[n++]) != tolower (s[len]))
return 0;
return 1;
}
int main (void) {
char s[MAXC], nospace[MAXC];
fputs ("enter a string: ", stdout);
if (!fgets (s, MAXC, stdin)) { /* Never, Ever use gets() */
fputs ("(user canceled input)\n", stderr);
return 1;
}
s[strcspn (s, "\r\n")] = 0; /* trim line-ending */
removespace (nospace, s); /* remove whitespace from s */
printf ("'%s' => %s a palindrome.\n",
s, checkpalindrome (nospace) ? "is" : "is not");
return 0;
}
( примечание: Никогда не экономьте на размере буфера! )
Пример использования / вывода
$ ./bin/checkpalindrome
enter a string: a
'a' => is a palindrome.
(вы можете изменить способ обработки строки из одного символа в соответствии с вашими потребностями)
$ ./bin/checkpalindrome
enter a string: aa
'aa' => is a palindrome.
$ ./bin/checkpalindrome
enter a string: ab
'ab' => is not a palindrome.
$ ./bin/checkpalindrome
enter a string: aba
'aba' => is a palindrome.
$ ./bin/checkpalindrome
enter a string: abc
'abc' => is not a palindrome.
$ ./bin/checkpalindrome
enter a string: A man a plan a canal Panama
'A man a plan a canal Panama' => is a palindrome.
Просмотрите все и дайте мне знать, если у вас есть вопросы.