了解K& R的代码

时间:2013-12-14 09:48:40

标签: c allocation readlines

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

/*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指定存储,这是一个指针。因此,我们为内存中的行长度分配适当的存储空间。这是对的吗?

2 个答案:

答案 0 :(得分:2)

line[len-1]='\0'

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

参见getline函数 if(c=='\n'){s[i]=c;++i; }

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

答案 1 :(得分:1)

  

是,我们为什么要删除“上一行”或“新行”?

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

  

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

是的,大概是,虽然我不知道alloc()究竟是什么。也许这是一个错字(你在代码中有很多它们),你真的打算写malloc()