我已經編寫了一個類似的函數,它是調用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);
什麼的 '?'和':'是什麼意思?這是否意味着'?'之前的狀況返回res或NULL?
這是一個相當大的問題,但感謝您的幫助。
PS:在頭文件中,READ_MAX的值爲5。
聽起來很合理。我也不明白它,這是一個吝嗇鬼。 – 2015-01-21 11:08:29
我不會說「令人驚訝的容易」,它很難閱讀,完全沒有註釋,而且代碼結構幾乎完全隱藏。嘗試從這段代碼開始,然後簡化它,每行只執行一個操作。希望結構會彈出。 – Gauthier 2015-01-21 11:51:46
'my_length()'函數過於頻繁,恕我直言。它有什麼作用 ? – wildplasser 2015-01-21 11:58:14