如何省略字符串的点,逗号和空格(检查回文所需要)

时间:2019-05-02 10:04:31

标签: c c99

我的回文检查程序(使用指针)必须包括几种情况。

输入可以是:

  1. 一个符号/字母(完成)
  2. 带有大写/小写字母的单词(完成)
  3. 符号束;如果只是符号,那么它总是回文(完成)
  4. 如果输入太大(> 80),则它不是回文(我需要使用fgets,我已经设法做到了)
  5. 如果是字母和符号的组合,则只需计算字母(STRUGGLING WITH)
  6. 带有白色和逗号的句子(STRUGGLING WITH) ->要获取输入,由于情况4,提示我仅使用fgets函数。我仍然无法设法将输入字符串转换为所需的形式

e。 G。: 输入:女士,我是亚当 输出:回文 输入:?a!a! 输出:回文

我已经设法使用指针创建回文函数,将字符串中可能的字母转换为小写,并且如果字符串仅包含符号,则显示“回文”。

我该如何转换e。 g。:

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

进入:

str[80] = "madamimadam";吗?

1 个答案:

答案 0 :(得分:0)

只需仔细检查整个字符串,然后以更方便的格式创建一个新字符串。在进行大小写转换的位置:

#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标准不能保证符号表中的字符是相邻的。而且查找表版本无论如何都运行得快得多,因此没有理由不在专业程序中使用它。