我已经编写了一个类似的函数,它调用get_next_line,并在每次调用时返回一个字符串到当前行。但是我发现有人做得非常容易,完全无法理解他的代码。我很乐意帮助你们。
char *get_next_line(const int fd)
{
static int last = 1;
static int rd = 0;
static int i = 0;
static char *res = NULL;
static char buff[READ_MAX];
if (buff[my_length(buff) - rd] == '\0')
{
if ((rd = read(fd, buff, READ_MAX)) <= 0)
return (res = (last-- && buff[my_length(buff) - rd - 1] != 10) ? res : NULL);
buff[rd] = '\0';
}
if ((res = (i == 0) ? malloc(sizeof(*res) * READ_MAX + 1) :
my_realloc(res, sizeof(*res) * READ_MAX + 1)) == NULL)
return (NULL);
while (buff[my_length(buff) - rd] && buff[my_length(buff) - rd] != '\n')
res[i++] = buff[my_length(buff) - rd--];
res[i] = '\0';
if (buff[my_length(buff) - rd] == '\n')
{
i = 0;
rd--;
return (res);
}
return (get_next_line(fd));
}
例如,我不明白:
return (res = (last-- && buff[my_length(buff) - rd - 1] != 10) ? res : NULL);
&#39;是什么?&#39;和&#39;:&#39;意思?是否适用于之前的情况?&#39;返回res还是NULL?
这是一个相当大的问题,但感谢您的帮助。
PS:头文件中READ_MAX的值为5。
答案 0 :(得分:1)
What does the '?' and ':' mean?
这在C
中称为Ternary operator。这里有一个例子,
result = a > b ? x : y;
相当于,
if (a > b) {
result = x;
} else {
result = y;
}
现在关于让您理解发布的代码,大多数是标准函数调用,例如read()
,malloc()
,realloc()
,sizeof()
,字符串终止{{1} 1}}等等,我建议逐一浏览每一行真的会帮助你学习。
答案 1 :(得分:0)
return (res = (last-- && buff[my_length(buff) - rd - 1] != 10) ? res : NULL);
此处?:
是三元运算符。如果?
之前的表达式变为TRUE,则?
之后的值立即执行,否则:
执行后的后一个值。
这与
相同if((last--) && (buff[my_length(buff) - rd - 1] != 10))
{
res = res;
}
else
{
res = NULL;
}
return res;
答案 2 :(得分:0)
这是三元运算符。请参阅此link。
( if the condition is true)?it will execute:or else it will execute;
在这种情况下
(res = (last-- && buff[my_length(buff) - rd - 1] != 10) ? res : NULL);
如果条件(res = (last-- && buff[my_length(buff) - rd - 1] != 10)
为真,则res
将返回。如果条件为假,则NULL
将返回。
等于此。
if ( (res = (last-- && buff[my_length(buff) - rd - 1] ) != 10 )
{
return (res=res);
}
else
{
return (res=NULL);
}