为什么我这样做:
int ft_is_alpha(char *str, int i)
{
return (((str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z')) ? 0 : 1);
}
它崩溃但是,当我这样做时:
int ft_is_alpha(char *str, int i)
{
if ((str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z'))
{
return (1);
}
return (0);
}
它没有崩溃..
我把这个函数称为
for (i = 0; str[i] != '\0'; ++i)
{
if (ft_is_equal_to(str, i))
{
++count;
int j;
j = i - 1;
while (str[++j] != '\0' && ft_is_alpha(str, j))
{
++length;
}
}
}
答案 0 :(得分:2)
我不知道崩溃的含义,第一个函数正确实现了测试但返回了正确值的反面。三元运算符的分支应与if (cond) {} else {}
语句中的分支顺序相同。它应该是:
int ft_is_alpha(char *str, int i) {
return (((str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z')) ? 1 : 0);
}
由于条件已经计算为布尔值,您可以通过删除不需要的三元运算符和一些括号来简化代码:
int ft_is_alpha(const char *str, int i) {
return (str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z');
}
可以删除最后一组括号,但可读性较差。
请注意,str
应声明为const char *
,因为函数不会修改字符串。同时删除return (1);
中的括号,不需要它们并将其视为错误的样式。
此外,为什么不分别通过str[i]
而不是str
和i
? API的这种更改将使代码更易于阅读,执行速度更快,使用更安全。