如何在忽略区分大小写和标点符号的情况下检查C中的回文?

如何在忽略区分大小写和标点符号的情况下检查C中的回文?,c,case-sensitive,palindrome,punctuation,C,Case Sensitive,Palindrome,Punctuation,我目前正在尝试写一个忽略标点和大小写的回文,1使用数组,2使用指针。我的问题是我不知道怎么做。除此之外,代码似乎工作正常。我还编写了一个从小写到大写的函数,但我认为它无论如何都不起作用 这是我第一个使用数组的代码 int is_palindrome1(const char phrase[], int length) { int first = phrase[0]; int last = phrase[length - 1]; for (length = 0; phrase[leng

我目前正在尝试写一个忽略标点和大小写的回文,1使用数组,2使用指针。我的问题是我不知道怎么做。除此之外,代码似乎工作正常。我还编写了一个从小写到大写的函数,但我认为它无论如何都不起作用

这是我第一个使用数组的代码

int is_palindrome1(const char phrase[], int length)
{
  int first = phrase[0];
  int last = phrase[length - 1];

  for (length = 0; phrase[length] != '\0'; length++)
  {
    while (last > first)
    {
      if ((phrase[first]) != (phrase[last]))
      {
        return 0;
      }
      last--;
      first++;
    }
    break;
  }
  return 1;
}
这是我的第二个使用指针的回文代码

int is_palindrome2(const char *phrase, int length)
{
  int i;
  length = strlen(phrase);

  for (i = 0; i < length / 2; i++)
  {
    if (*(phrase + i) != *(phrase + length - i - 1))
    {
      return 0;
    }
  }
  return 1;
}
int是回文2(常量字符*短语,int长度)
{
int i;
长度=strlen(短语);
对于(i=0;i
这是我的大小写转换函数

char lower_to_upper(char lower, char upper)
{
  if (lower >= 'a' && lower <= 'z')
  {
    upper = ('A' + lower - 'a');
    return upper;
  }
  else
  {
    upper = lower;
    return upper;
  }
}
char lower_到_upper(char lower,char upper)
{

如果(lower>='a'&&lowerSo。让我们分步骤进行

最简单的是_回文函数: 这看起来与您的代码非常相似。只是您遇到的一些语法问题已经解决。请注意,
s
e
指向字符串的第一个和最后一个字符

bool is_palindrome(const char *phrase, unsigned length) {
    const char *s = phrase + 0;
    const char *e = phrase + length - 1;

    while (s < e) {
        if (*s != *e)
            return false;
        s += 1;
        e -= 1;
    }
    return true;
}
其他字符(比如空格)呢 现在。最后一点是,你想忽略空格和标点符号。与其用这种方式来表达,不如谈谈我们想要比较的字符。我认为你只想比较字母数字字符。这些字符是a-z、a-z和0-9。要测试一个字符是否是其中之一,我们可以构建自定义函数,或者我们可以使用内置函数:

bool is_palindrome(const char *phrase, unsigned length) {
    const char *s = phrase + 0;
    const char *e = phrase + length - 1;

    while (s < e) {
        if (!isalnum(*s)) {
            s++;
        } else if (!isalnum(*e)) {
            e--;
        } else if (toupper(*s) == toupper(*e)) {
            s++;
            e--;
        } else {
            return false;
        }
    }
    return true;
}
bool是回文(常量字符*短语,无符号长度){
常量字符*s=短语+0;
const char*e=短语+长度-1;
而(s
最后的一些想法: 请注意,在循环的每个过程中,我们移动
s
e
,或者两个步骤都移动一步。这确保了我们最终将完成循环。
s
的条件也确保一旦我们到达字符串的“中间”,我们就完成了。我将中间放在引号中,因为对于字符串
“ab a”
,中间是第二个字符

语言是复杂的动物: 在大多数(所有?)系统中,英语的编码相当简单。但其他语言并不总是那么简单。在一篇评论中,chux对此提出了建议:

区域设置than可能具有从低到高的多对1映射,或者反之亦然,如果
(tolower(toupper(*s))!=tolower(toupper(*e))
处理此问题,则使用往返


我个人并不担心,因为我觉得在我们担心这一点的同时,我们也应该担心文本是如何编码的。是UTF-8吗?是其他原因吗?这可能超出了您的讲师的预期。

所以,让我们分步骤来做

最简单的是_回文函数: 这看起来与您的代码非常相似。只是您遇到的一些语法问题已经解决。请注意,
s
e
指向字符串的第一个和最后一个字符

bool is_palindrome(const char *phrase, unsigned length) {
    const char *s = phrase + 0;
    const char *e = phrase + length - 1;

    while (s < e) {
        if (*s != *e)
            return false;
        s += 1;
        e -= 1;
    }
    return true;
}
其他字符(比如空格)呢 现在。最后一点是,你想忽略空格和标点符号。与其用这种方式来表达,不如谈谈我们想要比较的字符。我认为你只想比较字母数字字符。这些字符是a-z、a-z和0-9。要测试一个字符是否是其中之一,我们可以构建自定义函数,或者我们可以使用内置函数:

bool is_palindrome(const char *phrase, unsigned length) {
    const char *s = phrase + 0;
    const char *e = phrase + length - 1;

    while (s < e) {
        if (!isalnum(*s)) {
            s++;
        } else if (!isalnum(*e)) {
            e--;
        } else if (toupper(*s) == toupper(*e)) {
            s++;
            e--;
        } else {
            return false;
        }
    }
    return true;
}
bool是回文(常量字符*短语,无符号长度){
常量字符*s=短语+0;
const char*e=短语+长度-1;
而(s
最后的一些想法: 请注意,在循环的每个过程中,我们移动
s
e
,或者两个步骤都移动一步。这确保了我们最终将完成循环。
s
的条件也确保一旦我们到达字符串的“中间”,我们就完成了。我将中间放在引号中,因为对于字符串
“ab a”
,中间是第二个字符

语言是复杂的动物: 在大多数(所有?)系统中,英语的编码相当简单。但其他语言并不总是那么简单。在一篇评论中,chux对此提出了建议:

区域设置than可能具有从低到高的多对1映射,或者反之亦然,如果
(tolower(toupper(*s))!=tolower(toupper(*e))
处理此问题,则使用往返


我个人并不担心,因为我觉得在我们担心这一点的同时,我们也应该担心文本是如何编码的。是UTF-8吗?是其他原因吗?这可能超出了您的讲师的预期。

在表达式
'A'+lower-'A'
中,在字符上执行时,您可能会出现溢出le计算中间结果。
int first=phrase[0];int last=phrase[length-1];
错误。有关上下转换,请参阅
ctype
库模块中的
int toupper(int c);
@Eugene Sh关于“在字符上执行可能会溢出”的内容在C++中,代码< > 'Ac/<代码>是<代码> int <代码>。在表达式<代码> 'A+Suff-'上'A/COD>在字符上执行时,在计算中间结果时,可能会溢出。<代码> int=短语[0 ];int =短语(长度-1);< /Cord> > WRO。