繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM