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