LINUX.ORG.RU

Массивы указателей K&R

 , , ,


0

2

Итак классика, пункт 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. Еще один аргумент к тому, что техническую литературу нужно читать в оригинале.

★★★★★

Последнее исправление: CYB3R (всего исправлений: 7)

Ответ на: комментарий от anonymous

Да, скопипастил на скорую руку, но кода там не много так что думаю глаза вытечь не успеют.

Twissel ★★★★★
() автор топика
Ответ на: комментарий от post-factum

Да я и так понял, что код без отступов, подправлю. Вы прямо как Борман, с его намеками ;-)

Twissel ★★★★★
() автор топика
Ответ на: комментарий от beastie

Кстати, чем лучше всего делать отступы внутри программы, я просто не помню та же Geany это умеет?

Twissel ★★★★★
() автор топика
Ответ на: комментарий от Twissel

Я, по старинке использую tab'ы и autoindent в vi.

beastie ★★★★★
()
Ответ на: комментарий от Twissel

Кстати, чем лучше всего делать отступы внутри программы, я просто не помню та же Geany это умеет?

Qt Creator.

Ctrl + A
Ctrl + I

EXL ★★★★★
()
Ответ на: комментарий от beastie

Спасибо. Просто обычно от чтения этой книги получаешь удовольствие, а сегодня все испортила эта опечатка. И понеслось...

Twissel ★★★★★
() автор топика
Ответ на: комментарий от Twissel

.vimrc

filetype plugin indent on
syntax on

set encoding=utf-8
set autoindent
set tabstop=4
set softtabstop=4
set shiftwidth=4
set noexpandtab
set wrap

man indent

+ в первой строке каждого файла можно прописать:

/* vim: set tabstop=4:softtabstop=4:shiftwidth=4:noexpandtab */
post-factum ★★★★★
()

Теперь это пост про отступы

unt1tled ★★★★
()

Теперь по сути. getline() с двумя аргументами — это откуда? man getline даёт вот такой прототип:

ssize_t getline(char **lineptr, size_t *n, FILE *stream);
post-factum ★★★★★
()

Теперь вопрос, там где комментарий «удаление конца строки», это в книге опечатка?

нет, это просто удаление '\n' из строки.

ananas ★★★★★
()
Ответ на: комментарий от ananas

То есть кривой перевод, т.к. '\n' — это перевод строки, а под концом строки в смысле Си я всегда подразумевал '\0'.

Twissel ★★★★★
() автор топика
Ответ на: комментарий от ananas

Вот так сядешь почитать классику погожим летним днем под раскидистой шевелюрой ореховых деревьев, а тут такое. И потом постишь тупняк на ЛОРе.

Twissel ★★★★★
() автор топика

За такое убивать!

В оригинале действительно delete newline, страница 91.

Так что, такому переводчику следовало бы оторвать репродуктивные органы.

С особой жестокостью :-D

Twissel ★★★★★
() автор топика
Последнее исправление: Twissel (всего исправлений: 1)

скорее всего имеют в виду, что удаляют перевод строки, а не терминирующий ноль

тред не читал

IvanR ★★★
()
Последнее исправление: IvanR (всего исправлений: 1)
Ответ на: комментарий от IvanR

Да, но такие вещи требуют точного перевода, а не libastral.so.2

Twissel ★★★★★
() автор топика

Кстати, нашел у себя в архивах K&R издательства «Невский Диалект», 2001 год.

В формате HTML.

Может как-нибудь собирусь спарсить оттуда исходники.

Так как раз правильный перевод сабжевого комментария :-)

Twissel ★★★★★
() автор топика
Последнее исправление: Twissel (всего исправлений: 2)
Ответ на: комментарий от Twissel

Кстати, нашел у себя в архивах K&R издательства «Невский Диалект», >>2001 год.

В формате HTML.

можешь выложить куда-либо?

b0c0813f
()
Ответ на: комментарий от Eddy_Em

Это же «Диалектика-Вильямс» :-\

После такого они сильно пали в моих глазах...

Twissel ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.