0

我正在为我的 c 语言课程阅读 K&R,我对第 5.6 节的函数 readlines 有疑问:

/*readlines: read input lines*/
int readlines(char *lineptr[], int maxlines)
{
    int len, nlines;
    char *p, line[MAXLEN];

    nlines=0;
    while ((len=getline(line, MAXLEN))>0) //getline gets a line of chars and return its 
                                          //length. if the length is negative,
                                          // no line exits.
        if (nlunes>=maxlines || (p=alloc(len))==NULL) //alloc allocates storage for input
           return -1;
        else{
            line[len-1]='\0' //**THIS IS THE PART I DON'T UNDERSTAND**
            strcpy(p,line); //copies line into p (strings)
            lineptr(nlines++)=p;
            }
    return nlines; /*return number of lines we could read*/

所以这个函数是一个排序函数的一部分,它使用 qsort 和指针按字典顺序对字符行数组进行排序。

我特别不明白以下行的作用

line[len-1]='\0' //**THIS IS THE PART I DON'T UNDERSTAND**

为什么我们必须删除“上一行”或“新行”?

此外,以下也不干净:

p=alloc(len)

我知道我们为 p 分配存储空间,它是一个指针。所以我们为内存中的行长度分配适当的存储空间。那是对的吗?

4

2 回答 2

2
line[len-1]='\0'

因为getline放入\n最后一个字符。

getline功能 if(c=='\n'){s[i]=c;++i; }

p分配给长度为的块,line以便可以将行复制到,因为line用于存储后续字符行,如果不复制,所有行都将丢失。

于 2013-12-14T09:57:59.237 回答
1

那么,为什么我们必须删除“上一行”或“新行”?

我们没有。这不是lineptr[len - 1],但是line[len - 1]。它以 NUL 终止字符串,因为 C 字符串应为 NUL 终止。

所以我们为内存中的行长度分配适当的存储空间?

是的,大概,虽然我不知道具体是做什么alloc()的。也许这是一个错字(代码中有很多),而您实际上是要写malloc()?

于 2013-12-14T09:56:20.203 回答