C语言ft_str_is_alpha判断纯字母串始终返回0的原因排查
ft_str_is_alpha 函数错误排查
核心错误原因
函数返回结果不符合预期,根源是if分支的判断逻辑存在运算符误用,同时测试用例设计也存在疏漏:
- 区间判断的逻辑运算符写反
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」是不可能成立的矛盾条件,永远为假。大写区间的判断也存在同样的错误。 - 两个区间的连接错用了
||(逻辑或):判断非字母需要同时满足「不在小写区间、不在大写区间」,应该用&&连接两个区间判断,而非||。
- 测试用例包含非字母字符
你写的第一个测试字符串"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
相关产品推荐
相关产品推荐

