You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

移除isalpha后单词回文检测函数恒返回0的问题排查与解决

单词回文检测函数始终返回0的问题解决

问题背景

我需要实现句子和单词的回文检测功能,其中句子回文检测函数运行正常,但单词回文检测函数无论输入是否为回文,始终返回0。原以为移除句子检测里跳过非字母字符的判断不影响单词检测,现在需要排查原因并仅用指针解决问题。

正常运行的句子回文检测函数

int checkSentencepalindrome(char * str)
{
    size_t len = strlen(str);
    
    char *pntr1 = str;
    char *pntr2 = str + len - 1;
    
    while(pntr2 >= pntr1)
    {
        if (!isalpha(*pntr2))
        {
            pntr2--;
            continue;
        }
        
        if (!isalpha(*pntr1))
        {
            pntr1++;
            continue;
        }
        
        if(tolower(*pntr1) != tolower(*pntr2))
        {
            return 0;
        }
        
        pntr1++;
        pntr2--;
    }
    return 1;
}

存在问题的单词回文检测函数

int checkWordpalindrome(char * str)
{
    size_t len = strlen(str);
    
    char *pntr1 = str;
    char *pntr2 = str + len - 1;
    
    while(pntr2 >= pntr1)
    {
        if(tolower(*pntr1) != tolower(*pntr2))
        {
            return 0;
        }
        
        pntr1++;
        pntr2--;
    }
    return 1;
}

问题复现的完整代码

int checkWpalindrome(char * str)
{
    printf("%s ", str);
    
    size_t len = strlen(str);
    
    if(len == 0)
    {
        return 0;
    }

    char *pntr1 = str;
    char *pntr2 = str + len - 1;
    
    while(pntr2 >= pntr1)
    {
        if(tolower(*pntr1) != tolower(*pntr2))
        {
            return 0;
        }
        
        pntr1++;
        pntr2--;
    }
    return 1;
}

void input(char * str)
{
    printf("Input: ");
    fgets(str, 101, stdin);
    fflush(stdin);
}

int main()
{
    char arr[10];
    
    input(arr);
    
    printf("%d", checkWpalindrome(arr));
    
    return 0;
}

问题原因

问题出在fgets函数的行为上:它会把用户输入时按下的换行符\n也读取到字符串中。比如输入回文单词level,数组中实际存储的是"level\n",此时strlen计算的长度是6。检测时,第一个字符是'l',最后一个字符是'\n',tolower处理后两者不相等,函数直接返回0。

解决方案(仅用指针实现)

在检测前,先处理字符串末尾的换行符。可以通过指针定位到字符串末尾,判断是否为换行符,若是则将其替换为字符串结束符\0,修正字符串长度。修改后的checkWpalindrome函数如下:

int checkWpalindrome(char * str)
{
    printf("%s ", str);
    
    size_t len = strlen(str);
    
    if(len == 0)
    {
        return 0;
    }

    // 用指针处理末尾的换行符
    char *end_ptr = str + len - 1;
    if(end_ptr >= str && *end_ptr == '\n')
    {
        *end_ptr = '\0';
        len--;
    }

    char *pntr1 = str;
    char *pntr2 = str + len - 1;
    
    while(pntr2 >= pntr1)
    {
        if(tolower(*pntr1) != tolower(*pntr2))
        {
            return 0;
        }
        
        pntr1++;
        pntr2--;
    }
    return 1;
}

这样处理后,输入回文单词时,换行符被移除,字符串长度正确,检测逻辑就能正常工作。

内容的提问来源于stack exchange,提问作者wolffsen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 05:15:36