【发布时间】:2022-01-08 06:55:32
【问题描述】:
下面的代码以下列方式工作:它基本上使用名为_getchar 的函数从stdin 读取每个字符,将它们分配到一个数组中,如果c =! EOF 最终返回它。
我只想知道下面代码中的(*lineptr)[n_read] = '\0'; 语句在做什么:
#include <unistd.h>
#include <stdlib.h>
int _getchar(void)
{
int rd;
char buff[2];
rd = read(STDIN_FILENO, buff, 1);
if (rd == 0)
return (EOF);
if (rd == -1)
exit(99);
return (*buff);
}
ssize_t _getline(char **lineptr, size_t *n, FILE *stream)
{
char *temp;
const size_t n_alloc = 120;
size_t n_read = 0;
size_t n_realloc;
int c;
if (lineptr == NULL || n == NULL || stream == NULL)
return (-1);
if (*lineptr == NULL)
{
*lineptr = malloc(n_alloc);
if (*lineptr == NULL)
return (-1);
*n = n_alloc;
}
while ((c = _getchar()) != EOF)
{
if (n_read >= *n)
{
n_realloc = *n + n_alloc;
temp = realloc(*lineptr, n_realloc + 1);
if (temp == NULL)
return (-1);
*lineptr = temp;
*n = n_realloc;
}
n_read++;
(*lineptr)[n_read - 1] = (char) c;
if (c == '\n')
break;
}
if (c == EOF)
return (-1);
(*lineptr)[n_read] = '\0';
return ((ssize_t) n_read);
}
【问题讨论】:
-
如果
ptr是一个指针,那么*ptr取消引用该指针,以获取它指向的对象。如果*ptr是一个数组,则(*ptr)[i]访问该数组的索引为i的元素。 -
*ptr总是与ptr[0]完全相同。所以(*ptr)[i]和ptr[0][i]完全一样。 -
那么,这是否意味着 (*lineptr)[n_read] = '\0'; null 会在最后一个位置终止 [n_read] 数组吗? @ElliottFrisch
标签: arrays c pointers getline getchar