为什么当我这样做的时候:
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;
}
}
}
最佳答案
我不知道你所说的崩溃是什么意思,第一个函数正确地实现了测试,但返回了与正确值相反的值。三元运算符的分支应与 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);
}
由于条件已经计算为 bool 值,您可以通过删除不需要的三元运算符和一些括号来简化代码:
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 的这一变化将使代码更易于阅读、执行速度更快且使用更安全。
关于C - 三元运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30898012/