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

C语言ft_str_is_alpha判断纯字母串始终返回0的原因排查

ft_str_is_alpha 函数错误排查

核心错误原因

函数返回结果不符合预期,根源是if分支的判断逻辑存在运算符误用,同时测试用例设计也存在疏漏:

  1. 区间判断的逻辑运算符写反
    ASCII编码中大小写字母的码值连续递增:大写A`Z`对应码值6590,小写a`z`对应码值97122。要判断一个字符不属于字母,需要满足「既不在小写字母区间,也不在大写字母区间」。
    你写的判断条件(str[i] < 'a' && str[i] > 'z') || (str[i] < 'A' && str[i] > 'Z')存在两处逻辑错误:
  • 单个区间的非集判断错用了&&(逻辑与):判断字符不在a~z区间,应该是小于a或者大于z(str[i] < 'a' || str[i] > 'z'),你写的「小于a且大于z」是不可能成立的矛盾条件,永远为假。大写区间的判断也存在同样的错误。
  • 两个区间的连接错用了||(逻辑或):判断非字母需要同时满足「不在小写区间、不在大写区间」,应该用&&连接两个区间判断,而非||。
  1. 测试用例包含非字母字符
    你写的第一个测试字符串"Hello World"中间包含空格,空格不属于字母范畴,哪怕判断逻辑完全正确,这个用例的返回值也应该是0,不符合你「全字母返回1」的测试预期,会让你误以为所有输入都返回0。

修复后可运行代码

#include <stdio.h>

int ft_str_is_alpha(char *str)
{
    int i = 0;

    while (str[i] != '\0')
    {
        // 非字母判定:既不在小写区间,也不在大写区间
        if ((str[i] < 'a' || str[i] > 'z') && (str[i] < 'A' || str[i] > 'Z'))
        {
            return 0;
        }
        i++;
    }
    return 1;
}

int main(void)
{
    char *str;

    str = "HelloWorld"; // 移除空格,为全字母字符串
    printf("%s - %d\n", str, ft_str_is_alpha(str)); // 输出:HelloWorld - 1
    str = "H1LLO W0RLD"; // 包含数字、空格非字母字符
    printf("%s - %d\n", str, ft_str_is_alpha(str)); // 输出:H1LLO W0RLD - 0
    return 0;
}

补充说明:原代码的main函数缺少<stdio.h>头文件引用,会导致printf隐式声明警告,部分编译环境下可能出现运行异常,修复时已补上。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 06:42:29