【问题标题】:How to omit the dots, commas and white spaces for a string (needed for checking a palindrome)如何省略字符串的点、逗号和空格(检查回文时需要)
【发布时间】:2023-11-04 20:24:02
【问题描述】:

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

输入可以是:

  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";?

【问题讨论】:

  • 不允许使用isalpha?
  • @P.W 对此不太确定,我们可以使用一些工具,但 e。 G。对于大写/小写,我必须创建一个原始函数(我已经完成了),但感谢您的提示,我至少会尝试一下

标签: c c99


【解决方案1】:

只需浏览整个字符串并以更方便的格式创建一个新字符串。在您进行大小写转换的同一位置:

#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 &gt;= 'A' &amp;&amp; ch &lt;= 'Z'),假设仅大写。这对于学生作业来说可能没问题,但对于生产质量代码来说却不是。由于 C 标准不能保证字符在符号表中是相邻的。而且查找表版本的运行速度要快得多,因此没有理由不在专业程序中使用它。

【讨论】:

  • (“所以没有理由不在专业程序中使用它”当然,如果您正在编写一些 1980 年代的 crapitechture 8 位 MCU,并且闪存非常有限。)