[英]Why does my palindrome function not work with spaces in C?
我写了一个回文 function,对于那些不知道的人来说,这意味着一个 function 接收一个单词/短语/句子,如果该单词/短语/句子是相同的字符串反转,则返回 true。
出于某种原因,我的 function 仅适用于没有空格的情况。
isPalindrome("madam")
返回true
。
isPalindrome("nurses run")
返回不正确的false
这是 function:
#include <stdbool.h>
bool isPalindrome(char* str){
char* ptr;
char* aux;
ptr = str;
while (*ptr != '\0') {
++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: %s\n", isPalindrome("nurses run") ? "true" : "false"); // prints false - not expected
printf("Question 6b: %s\n", isPalindrome("madam") ? "true" : "false"); // prints true as expected
有什么办法可以容纳原始字符串中的空格字符?
为什么不以另一种方式接近呢?
检查您的初始字符串,查看字符串的大小(没有空格),除以二。 如果奇怪,特殊情况。 如果是偶数,则从头运行到中间,并在 for 循环中比较 [i] 和 [size-i]
奇怪的是,做同样的事情,但不要触及确切的中间元素(最终结果相同)
^至于“贯穿”,我知道你不想要空格,但你可以创建一个没有空格的临时字符串。 您知道字符串的最大大小,因此分配/分配是可行的。
在您的 for 循环中,您可以跳过空格。 在 for 循环之后检查前两个 if 语句。
#include <stdbool.h>
bool isPalindrome(char* str){
char* ptr;
char* aux;
ptr = str;
while (*ptr != '\0') {
++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: %s\n", isPalindrome("nurses run") ? "true" : "false"); // prints true - as expected
printf("Question 6b: %s\n", isPalindrome("madam") ? "true" : "false"); // prints true as expected
}
您的 function 检查两个字符是否相等,如果不相等,则返回 false。 如果您只使用字母符号(az、AZ),这种态度是正确的,但如果字符串中有空格(或标点符号),您最终会将字母与空格(或标点符号)进行比较,这将立即使isPalindrome
返回 false。
为避免该问题,您可以首先删除输入字符串中的空格(和标点符号等),并将所有字母小写(参见第二个示例)并比较这个,例如"nurses run"
将转换为"nursesrun"
和"Was it a car or a cat I saw?"
会变成"wasitacaroracatisaw"
。
如果您不考虑字符串中大小写字母的可能性, "testset"
将是回文,但"tEstset"
不会。
严格来说, nurses run
并不是回文。 因为,如果第 7 个字符有空格,那么第 4 个字符也应该有空格。 无论如何,这不是你的需要,对吧?
所以,你想忽略空格来检查它是否是回文。 您可以使用This ,或 Make another function 删除字符串中的所有空格并在开头的回文检查 function 中调用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.