Как опустить точки, запятые и пробелы для строки (необходим для проверки палиндрома) - PullRequest
0 голосов
/ 02 мая 2019

Моя программа для проверки палиндрома (с использованием указателей) должна рассчитываться с несколькими видами случаев.

Ввод может быть:

  1. один символ / буква (выполнено)
  2. слово с прописными / строчными буквами (готово)
  3. связка символов;если только символы, то это всегда палиндром (готово)
  4. , если ввод слишком большой (> 80), то это не палиндром (мне нужно использовать fgets для того, что мне удалось получитьготово)
  5. комбинация букв и символов, если это так, то просто посчитать буквы (STRUGGLING WITH)
  6. предложение с белыми и запятыми (STRUGGLING WITH) -> Чтобы получить ввод, ямне предлагают использовать только функцию fgets из-за случая 4. Мне все еще не удается преобразовать строку ввода в желаемую форму

например: input: Madam, I'm Adam output:вход палиндрома: ааа!выходные данные: палиндром

Мне уже удалось создать функцию палиндрома с использованием указателей, преобразовать возможные буквы в строке в строчные буквы и отобразить «палиндром», если строка состоит только изсимволы.

Как мне удалось преобразовать, например:

char str[80] = "Madam, I'm Adam";

в:

str[80] = "madamimadam";?

1 Ответ

0 голосов
/ 02 мая 2019

Просто прожуйте всю строку и создайте новую в более удобном формате. Там же, где вы делаете конверсию дела:

#include <ctype.h>

void format (char* dst, const char* src)
{
  size_t i=0;

  while(*src != '\0')
  {
    char ch = tolower(*src);
    if(isalpha(ch))
    {
      *dst = ch;
      dst++;
    }
    src++;
  }
}

Если isalpha недоступно по какой-либо искусственной причине, вы можете легко создать его самостоятельно. Вот быстрая, портативная версия справочной таблицы:

#include <stdbool.h>

bool my_isalpha (char ch)
{
  static const bool ALLOWED[256] =
  {
    ['A'] = true;
    ['B'] = true;
    ['C'] = true;
    ...
  };

  return ALLOWED[ch];
}

Наивные версии одной и той же функции просто проверяют if(ch >= 'A' && ch <= 'Z'), предполагая только прописные буквы. Это, вероятно, нормально для студенческого задания, но не для производственного кода качества. Поскольку в стандарте C нет гарантии, что символы находятся рядом в таблице символов. И в любом случае версия справочной таблицы работает намного быстрее, поэтому нет причин не использовать ее в профессиональной программе.

...