C语言 函数检查字符串是否为回文

cnjp1d6j  于 2023-01-25  发布在  其他
关注(0)|答案(1)|浏览(123)

这个函数应该检查输入字符串是否是回文。它不应该区分大小写,并且必须忽略除字母和数字之外的所有其他字符。我遇到的问题是当字符串为空时(这意味着只有空格是字符串的元素),以及当字符串有很多其他字符,但没有字母或数字时。
这是我的代码,除了上面提到的情况外,它运行良好。

#include <stdio.h>
  #include <string.h>
  #include <ctype.h>

  int is_it_palindrome(const char* str){

    int lenght;
    lenght=strlen(str);

    const char *start=str+0;
    const char *end=str+lenght-1;

    while(start<end){
        if(!isalnum(*start)){
            start++;
        }
        else if(!isalnum(*end)){
            end--;
        }
        else if(toupper(*start)==toupper(*end)){
            start++;
            end--;
        }
        else{
            return 0;
        }
    }

    return 1;
 }

int main() {
    
    printf ("%d", is_it_palindrome("    "));
    printf ("%d", is_it_palindrome("a"));
    printf ("%d", is_it_palindrome(",./!\n+_[]{}@"));
    printf ("%d", is_it_palindrome(",./!\n+_A[]{}@"));
    
return 0;
}

如果不是回文,函数返回0,如果是回文,返回1,所以这里的输出应该是0101,但是我得到了1111,我真的不知道如何重写这个程序,来包含我需要的条件,我真的很感激你的帮助。

gwbalxhn

gwbalxhn1#

不包含字母数字字符的字符串不是回文,但根据规则,它永远不会到达return 0;,因为您跳过了非字母数字字符。要检查它,您必须添加一个标记,以跟踪是否有任何字母数字字符。此外,为了检测单个alnum字符,我转到start <= end而不是start < end

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int is_it_palindrome(const char* str) {
    int lenght;
    int has_alnum = 0;
    lenght=strlen(str);

    const char* start = str + 0;
    const char* end = str + lenght - 1;

    while (start <= end) {
        if (!isalnum(*start)) {
            start++;
        } else if (!isalnum(*end)) {
            end--;
        } else if (toupper(*start) == toupper(*end)) {
            has_alnum = 1;
            start++;
            end--;
        } else {
            return 0;
        }
    }

    return has_alnum;
}

int main(void) {
    printf("%d", is_it_palindrome("    "));
    printf("%d", is_it_palindrome("a"));
    printf("%d", is_it_palindrome(",./!\n+_[]{}@"));
    printf("%d", is_it_palindrome(",./!\n+_A[]{}@"));

    return 0;
}

相关问题