如何在忽略区分大小写和标点符号的情况下检查C中的回文?
我目前正在尝试写一个忽略标点和大小写的回文,1使用数组,2使用指针。我的问题是我不知道怎么做。除此之外,代码似乎工作正常。我还编写了一个从小写到大写的函数,但我认为它无论如何都不起作用 这是我第一个使用数组的代码如何在忽略区分大小写和标点符号的情况下检查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
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。