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