Понимание кода от K&R

Я читаю K&R для моего курса c языка, у меня есть вопрос в readlines функции из раздела 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 ответа

Решение
line[len-1]='\0'

так как getline путы \n в последнем символе.

видеть в getline функцияif(c=='\n'){s[i]=c;++i; }

Также p выделяется на блок длиныline так что эта строка может быть скопирована в потому что line используется для хранения последующей строки символов, если она не скопирована, вся строка будет потеряна.

Почему мы должны удалить "предыдущую строку" или "новую строку"?

Мы не Это не lineptr[len - 1], но line[len - 1], Он NUL-завершает строку, так как ожидается, что строки C будут заканчиваться NUL.

поэтому мы выделяем соответствующее хранилище для длины строки в памяти?

Да, по-видимому, хотя я не знаю, что именно alloc() делает. Возможно, это опечатка (у вас их довольно много в коде), и вы действительно хотели написать malloc()?

Другие вопросы по тегам