为什么我的回文函数不适用于 C 中的空格?



我写了一个回文函数,对于那些不知道的人来说,这意味着一个函数,它接受一个单词/短语/句子,如果该单词/短语/句子是相同的字符串反转,则返回true。

出于某种原因,我的函数仅适用于没有空格的情况。

isPalindrome("madam")返回true这是正确的。

isPalindrome("nurses run")返回

不正确的false

函数如下:

#include <stdbool.h>
bool isPalindrome(char* str){
char* ptr;
char* aux; 
ptr = str; 
while (*ptr != '') { 
++ptr;
} 
--ptr; 
for (aux = str; ptr >= aux;) { 
if (*ptr == *aux) { 
--ptr; 
aux++; 
} 
else{
break;
}  
} 
if (aux > ptr){
return true;
} 
else{
return false;
}
}

呼叫/驱动程序代码:

printf("Question 6a: %sn", isPalindrome("nurses run") ? "true" : "false"); // prints false - not expected
printf("Question 6b: %sn", isPalindrome("madam") ? "true" : "false"); // prints true as expected

有什么方法可以容纳原始字符串中的空格字符吗?

在 for 循环中,您可以跳过空格。检查 for 循环之后的前两个 if 语句。

#include <stdbool.h>
bool isPalindrome(char* str){
char* ptr;
char* aux; 
ptr = str; 
while (*ptr != '') { 
++ptr;
} 
--ptr; 
for (aux = str; ptr >= aux;) { 
if(*ptr == ' ') {
--ptr;
continue;
}
if(*aux == ' ') {
aux++;
continue;
}
if (*ptr == *aux) { 
--ptr; 
aux++; 
} 
else{
break;
}  
} 
if (aux > ptr){
return true;
} 
else{
return false;
}
}
int main() {
printf("Question 6a: %sn", isPalindrome("nurses run") ? "true" : "false"); // prints true - as expected
printf("Question 6b: %sn", isPalindrome("madam") ? "true" : "false"); // prints true as expected
}

为什么不换一种方式呢?

检查初始字符串,查看字符串的大小(不带空格(,除以 2。 如果奇数,特殊情况。 如果偶数,则从开始运行到中间,并在 for 循环中将 [i] 与 [size-i] 进行比较

对于奇数,做同样的事情,但不触摸确切的中间元素(最终会相同(

^至于"贯穿",我知道你不想要空格,但你可以创建一个没有空格的临时字符串。您知道字符串的最大大小,因此分配/分配是可行的。

严格来说,nurses run不是回文。因为,如果它在第 7 个字符处有空格,那么它也应该在第 4 个字符处有空格。 无论如何,这不是你的需要,对吧?

因此,您要忽略空格以检查它是否是回文。您可以使用 This, or Make 另一个函数来删除字符串中的所有空格,并在开始时在回文检查函数中调用它。

您的函数检查两个字符是否相等,如果相等,则返回 false。如果您只使用字母符号(a-z,A-Z(,则这种态度是正确的,但是如果字符串中有空格(或标点符号(,则最终会将字母与空格(或标点符号(进行比较,这将立即使isPalindrome返回false。

为了避免这个问题,你可以首先去掉输入字符串中的空格(和标点符号等(,把所有的字母都变成小写(见第二个例子(并比较这个,例如"nurses run"将被转换为"nursesrun""Was it a car or a cat I saw?"将变得"wasitacaroracatisaw"

如果您不考虑字符串中小写和大写字母的可能性,"testset"将是一个回文,但"tEstset"不会。

相关内容

最新更新