Итак классика, пункт 5.6, там есть вот такой пример подсчета строк
#include <stdio.h>
#include <string.h>
#define MAXLINES 5000 /* максимальное число строк */
char *lineptr[MAXLINES]; /* указатели на строки */
int readlines(char *lineptr[], int nlines);
void wntelines(char *lineptr[], int nlines);
void qsort(char *lineptr[], int left, int right);
/* сортировка строк */
int
main()
{
        int nlines; /* количество прочитанных строк */
        if ((nlines = readlines(lineptr, MAXLINES)) >= 0) {
                qsort(lineptr, 0, nlines-1);
                writelines(lineptr, nlines);
                return 0;
        } else {
                printf("ошибка: слишком много строк\n");
                return 1;
        }       
}
#define MAXLEN 1000 /* максимальная длина строки */
int getline(char *, int);
char *alloc(int);
/* readlines: чтение строк */
int
readlines(char *lineptr[], int maxlines)
{       
        int len, nlines;
        char *p, line[MAXLEN];
        nlines = 0;
        while ((len = getline(line, MAXLEN)) > 0)
                if (nlines >= maxlines || (p = alloc(len)) == NULL)
                        return -1;
                else {
                        line[len-1] = '\0'; /* удаление конца строки */
                        strcpy(p, line);
                        lineptr[nlines++] = p;
                }
        return nlines; 
}
/* writelines: печать строк */
void
writelines(char *lineptr[], int nlines)
{       
        int i;
        for (i = 0; i < nlines; i++)
                printf("%s\n", lineptr[i]);
}       
Теперь вопрос, там где комментарий «удаление конца строки», это в книге опечатка? Иначе как мы можем узнать в массиве, где заканчивается одна строка и начинается другая? Думаю, что да. Просто час ломал голову и думал, что нашел эпический баг в такой старой книжке ;-)
P.S. Еще один аргумент к тому, что техническую литературу нужно читать в оригинале.





