LINUX.ORG.RU

Книга по C


0

2

Вот такой вот вопрос. Начал читать Кернигана и Ритчи «Язык программирования Си» - но как мне уже подсказали, она устарела, и некоторые вещи работать не будут (на что я собственно и наткнулся). В википедии наткнулся на книженцию Герберта Шилдта «C: полное руководство, классическое издание», но не могу найти в pdf/djvu.

Уровень начинающий.

Наличие C11 приветсвуется (C99 обязательно).

★★★★★

она устарела, и некоторые вещи работать не будут

Ничего подобного!

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

Раздел 1.9 (берем 3-е издание, исправленое)

string.c

#include <stdio.h>
#define MAXLINE 1000
int getline(char line[], int MAXLINE);
void copy(char to[], char from[]);
main ()
{
int len;
int max;
char line[MAXLINE];
char longest[MAXLINE];
max = 0;
while ((len = getline(line, MAXLINE)) > 0)
    if (len > max) {
        max = len;
        copy (longest, line);
    }
    if (max > 0)
        printf ("%s", longest);
    return 0;
}
int getline(char s[], int lim)
{
int c, i;
for (i = 0; i < lim-1 && (c = getchar()) != EOF && c != '\n'; ++i)
    s[i] = c;
if (c == 'n') {
    s[i] = c;
    ++i;
    }
s[i] = '\0';
return i;
}
void copy (char to[], char from[])
{
int i;
i = 0;
while ((to[i] = from[i]) != '\0')
    ++i;
}

канпеляем

gcc string.c 
string.c:3:30: ошибка: expected «;», «,» or «)» before numeric constant
string.c: В функции «main»:
string.c:13:1: предупреждение: в передаче аргумента 1 «getline»: несовместимый тип указателя [по умолчанию включена]
/usr/include/stdio.h:675:20: замечание: expected «char ** __restrict__» but argument is of type «char *»
string.c:13:1: предупреждение: при передаче аргумента 2 «getline» целое преобразуется в указатель без приведения типа [по умолчанию включена]
/usr/include/stdio.h:675:20: замечание: expected «size_t * __restrict__» but argument is of type «int»
string.c:13:1: ошибка: слишком мало аргументов в вызове функции «getline»
/usr/include/stdio.h:675:20: замечание: declared here
string.c: На верхнем уровне:
string.c:22:5: ошибка: несовместимые типы для «getline»
/usr/include/stdio.h:675:20: замечание: здесь была предыдущая декларация «getline»

То что define MAXLINE 1000 должно идти после объявления int MAXLINE я догадался, а что сейчас есть библиотечная функция getline() мне подсказали.

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

делаем так:

#include <stdio.h>
int getline(char line[], int MAXLINE);
void copy(char to[], char from[]);
#define MAXLINE 1000

получаем:

string.c:3:5: ошибка: несовместимые типы для «getline»
/usr/include/stdio.h:675:20: замечание: здесь была предыдущая декларация «getline»
string.c:22:5: ошибка: несовместимые типы для «getline»
/usr/include/stdio.h:675:20: замечание: здесь была предыдущая декларация «getline»
leg0las ★★★★★
() автор топика
Ответ на: комментарий от leg0las

я просто уверен, что вместо

int getline(char line[], int MAXLINE);
int getline(char line[], int maxline);
hizel ★★★★★
()
Ответ на: комментарий от leg0las

Не надо свою getline объявлять.

Вот пример использования библиотечной функции.

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

В двух местах исправить (MAXLINE убрать из объявления и переименовать функцию getline):

  • int getline(char line[], int MAXLINE);
    
    на
    int getline2(char line[], int maxline);
    
  • int getline(char s[], int lim)
    
    на
    int getline2(char s[], int lim)
    
adzeitor
()
Ответ на: комментарий от leg0las

define MAXLINE 1000 должно идти после объявления int MAXLINE я догадался

Препроцессор просто заменяет MAXLINE на 1000. Естественно, что ты имеешь int 1000, а не int MAXLINE. Перестановка конечно решает проблему, но выглядит это как-то по-арчлинусовски.

anonymous
()

Увы, чтение K&R обязательно. Просто не бери доисторических изданий, используй мозг и всё будет хорошо. А вот зачем тебе c11 и с99, если ни первый, ни второй толком не умеют многие компиляторы?

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

А у меня и так самое последнее ихнее издание. Кстати «if (c == 'n') {» у меня тоже есть, исправил. Я так понимаю наличие оригинальной книги на инглише приветствуется, дабы избежать подобных опечаток?

c99 и c11 вроде как поддерживает gcc, с последним разве-что моменты. Хочется писать все по стандарту и «как надо».

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

Посмотри на GNU C Reference Manual или как-то так

Sholy
()

Я бы ещё порекомендовал...

C в чистом виде это здорово и интересно, однако необходимо учитывать специфику.

Итак, если не сгодятся ТС, то может кому ещё пригодятся:

1. Рочкинд М. Программирование для UNIX. 2-е изд.

По крайней мере несколько тем, которые рассматривались в этом разделе, там можно посмотреть. Навскидку — работа с сигналами и обработка ошибок. Это, скорее, не просто по С, это ближе к специфичным для Linux вещам.

2. Ну и, если есть сомнения, то — http://pubs.opengroup.org/onlinepubs/009695399/ Это The Open Group Base Specifications Issue 6 IEEE Std 1003.1, 2004 Edition, тут можно посмотреть как именно стандарт трактует те или иные вещи.

3. А вот это — супер мастхэв! The linux programming interface Автор Michael Kerrisk, что-то под 1600 страниц (у меня в печатном виде), рассмотрено по-моему всё, что только можно. Вплоть до inotify api, epoll() и прочая-прочая. Само собой что С, но заточено именно на Linux.

mr_noone
()
Ответ на: комментарий от leg0las

Плюсую!

Хочется писать все по стандарту и «как надо».

Люто, бешено, неистово!

mr_noone
()
Ответ на: комментарий от leg0las

Не читайте, дети, книжки, полученные методом неграмотного OCR хреново сканированных бумажных книг!

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

Дык!

Что ж у них соглашение по отступам в коде такое уродливое?

Во-первых, это не догма, а «руководство к действию», во-вторых, indent'ом (http://www.gnu.org/software/indent/manual/indent.html) ни когда не поздно перекрутить сырцы так, как надо или удобнее. Мне вот больше нравится kernel coding style (http://www.kernel.org/doc/Documentation/CodingStyle)...

mr_noone
()

Начал читать перевод K&R от издательства Вильямс и уже на первых 50 страницах нашел немалое количество опечаток. Может, оригинал этих проблем не имеет?

pevzi ★★★★★
()

Читай в оригинале в нераспознанном виде. И это не только к K&R относится.

power
()
Ответ на: комментарий от leg0las

К сожалению, нет.

Но у меня в принципе, есть идея. Тут (на LOR) есть же wiki, какая-никакая? В принципе, можно было бы перевести, малость подправить (там есть мелкие огрехи), да выложить. Ну и там же есть спорные (на мой взгляд) моменты, их можно было бы обсудить.

mr_noone
()
Ответ на: комментарий от leg0las

Ну, в принципе, да...

Параллельно и С с английским подтянется. :)

mr_noone
()

но не могу найти в pdf/djvu.

То, что ты ищешь называется: Герберт Шилдт - Полный справочник по C
На сайте издательства называется: C: полное руководство, классическое издание

Поскольку книга больше издаваться не будет - издательство продает электронную версию за 170 российских рублей

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

Я так понимаю наличие оригинальной книги на инглише приветствуется, дабы избежать подобных опечаток?

Есть русский перевод второго издания от «Финансы и Статистика» 1988/89 гг., где такой лажи нет.

А так, да. «Перевод» от пидаров из «Диалектики» наполовину состоит из опечаток.

LamerOk ★★★★★
()

В качестве альтернативы K&R на русском есть
1. Кочан Стефан «Программирование на языке С» (ISBN: 5-8459-1088-9)
2. Сэмюел П. Харбисон, Гай Л. Стил «Язык программирования С» (ISBN: 978-5-9518-0334-4)

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

Имею книгу данного издательства от 2006 года. Ошибок вроде как и не припомню. А вот когда читала Кочана от этого же издательства, то было лютое желание редактора вздернуть.
В любом случае, желающие могут pdf оригинала стянуть - http://dl.dropbox.com/u/13814019/R&K.pdf

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

Ошибок вроде как и не припомню

Ну, из того, что сразу вспомнилось.

Раздел 1.5.3, последняя строка:

Операторы while и end помогают безошибочно обрабатывать разного рода предельные случаи.

Должны быть while и for.

Раздел 2.3:

«hello,» «world»
«hello, world»

Очевидно, в первом случае подразумевался пробел перед world.

И прочие подобные мелочи. В оригинале все нормально.

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

И прочие подобные мелочи. В оригинале все нормально.

Видимо я невнимательно читал :)

В Кочане апофеозом был неправильный порядок передачи аргументов calloc'у. С тех пор к Вильямсу у меня нехорошее отношение.

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

С тех пор к Вильямсу у меня нехорошее отношение.

Это всё те же пидары из Диалектики, которые под этой маркой переводят^W уродуют очень не плохие книги в основном издательства Addison-Wesley.

LamerOk ★★★★★
()

шилд какашка.

начинать сразу с C11 и С99 - перегружать сознание произвольными частностями.

наилучший вариант

первое издание kr 1978eng и 1984ru - там те вещи из за которых с так популярен и lint ежель тебе нужно типобезопасность аналогов.

если реально начинающий

найди (легко) Прата Язык Си - там для реально начинающего.

зы. здесь уже было неоднократно чё как

кстати посмотри сырцы типо леон коментари либо чё нить из современного.

qulinxao ★★☆
()

Чего только не узнаешь, вот и библия Си внезапно устарела. Вообще язык Си не из тех, которые нужно учить, его лучше понимать на примере читаемого/создаваемого кода. Читай Кернигана, С-шные трюки от мыщъх'а, и начинай понемногу велосипедить.

je-ke
()
Ответ на: комментарий от je-ke

Вообще язык Си не из тех, которые нужно учить

Ну да, понимание абстрактоной машины Си проникает в сознание напрямую из астрала.

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