LINUX.ORG.RU

Как понять чистый С (без библиотек), awk и sed за 10 минут?

 , , ,


2

2

Понимаю основные концепты в высокоуровневых ЯП, типа классов, функций и т.д. Писал на питоне скрипты для себя. Сейчас есть возможность поступить в европе в школу 42 (в рф называется школа 21), где усиленно учат первое время С.

Посмотрел их задания, а там что-то типа алгоритмов и вначале программирование без библиотечных функций. Выводят через write в буфер, кодят аналоги функций в стандартной библиотеке, мыслят алгоритмически и т.д. Все по канонам CS.

У меня же от чистого С с поинтерами и низкоуровневыми алгоритмами взрывается мозг. Очевидно книжки по обычному С с его библиотечными функциями не подходят. Попробовал книгу столлмана по С, но там скорее справочная информация и вглубь, да не туда. В какие-то темы вроде математики над указателями вообще не вижу смысла сейчас углубляться.

Ко всему прочему, видел пару заданий на знание awk и sed. И вообще в целом умение распарсить строки из терминала. По времени есть где-то месяц.

Вопрос, как можно подготовиться к такому? Откуда черпать информацию? Может есть уже золотая классика? Информации слишком много и она плохо отсортирована, прошу совета.

Перемещено hobbit из general

Очевидно книжки по обычному С с его библиотечными функциями не подходят. Попробовал книгу столлмана по С, но там скорее справочная информация и вглубь, да не туда.

Не надо путать язык Си (синтаксис) и стандартную библиотеку. В книжках обычно и первое и второе рассказывают, но знание второго никак первому не навредит. Так что учи синтаксис (хотя как я понял ты его и так знаешь) и учись правильно алгоритмы сочинять - тут Си вообще ни при чём уже.

В какие-то темы вроде математики над указателями вообще не вижу смысла сейчас углубляться.

Некуда там углубляться, всё примитивно и тривиально. Си - это удобный синтаксис, и не более того. «Математика над указателями» - это обычная арифметика начальной школы (сложение, вычитание, умножение, деление).

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

Попробуй эту книгу почитать. Если постараться можешь и пиратскую версию найти. Но рекомендуется ознакомиться с самим языком, хотя бы с концепцией сишных строк, плюс в K&R2 почитай 6.5 (Self-referential structures) и 6.6 (Table lookup).

Выводят через write в буфер

Запрещают использовать printf?

кодят аналоги функций в стандартной библиотеке, мыслят алгоритмически

Одно с другим не особо связано.

Ко всему прочему, видел пару заданий на знание awk и sed

man sed && man grep && man awk. Ну и ещё книжки есть конечно же, например по awk.

luke ★★★★★
()

низкоуровневыми алгоритмами взрывается мозг

И, что, вы за месяц хотите новый мозг отформатировать? Вы можете вобще без Си изучать какие-нибудь алгоритмы, возмите питон да сортируйте массив. Переписывайте из старых детских книжек с Basic на Питон... Если за неделю изменений не наступит, то забейте.

А по поводу sed, можете читая man поразбирать примеры однострочников:
http://rus-linux.net/MyLDP/consol/sed.html
https://housecomputer.ru/programs/sed/Commands_sed_Linux.html
https://habr.com/ru/companies/ruvds/articles/327530/
Но, если там будут задания, где на sed нужно использовать переходы и дополнительный буфер (hold space), то бегите :)

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

Попробуй эту книгу почитать. Если постараться можешь и пиратскую версию найти. Но рекомендуется ознакомиться с самим языком, хотя бы с концепцией сишных строк, плюс в K&R2 почитай 6.5 (Self-referential structures) и 6.6 (Table lookup).

Спасибо, ознакомлюсь. Название книги «алгоритмы + Си» сразу же звучит как то что надо :)

Запрещают использовать printf?

Да. Потом заставляют написать свои функции и использовать их.

Ковырял немного си и попытался написать fizzbuzz. С printf с первого раза не заработало, погуглил, подключил stdio и добавил %d в вывод. Все легко и понятно.

Попробовал сделать как они хотят этого, без printf. Вызвало НЕДОУМЕНИЕ на моменте вывода через write. Вместо числа i в консоли из цикла выводило символ соответствующий этому числу в ANSI. Попытки привести к типу и т.д. не помогали. Пришлось делать костыли, но очень тяжело мыслить в эту сторону, не знаю как подступаться к таким абстрактным ситуациям.

man sed && man grep && man awk.

man пробовал читать, но вообще не зашло. Попробую книжку. Пример того что просят сделать на 2 день учебы:

Write a command line that displays the output of a cat /etc/passwd command, removing comments, every other line starting from the second line, reversing each login, sorted in reverse alphabetical order, and keeping only logins between FT_LINE1 and FT_LINE2 included, and they must separated by ", " (without quotation marks), and the output must end with a «.».

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

И, что, вы за месяц хотите новый мозг отформатировать?

Да :)

Мотивации достаточно. Ну и это же учеба, а не собеседование в Google по алгоритмам! Сама школа говорит можете не готовиться вообще. Но посмотрев их задания у меня закрадываются определенные сомнения..

Вы можете вобще без Си изучать какие-нибудь алгоритмы, возмите питон да сортируйте массив. Переписывайте из старых детских книжек с Basic на Питон… Если за неделю изменений не наступит, то забейте.

Тоже хороший совет. Надеюсь изменения наступят. Я например не понимал как вообще возможно реализовать бинарное дерево кодом, а сейчас погуглил-почитал, сел с бумажкой и примерно накидал структуру. С листьями и родителем.

Плюс после первых глав в книге Столлмана по С понял как можно реализовать алгоритм поиска числа фибоначчи используя рекурсию. Опять же расписав все на бумажке. Заодним очень хорошо понял что такое стек вызовов, получилось наглядно :)

А по поводу sed, можете читая man поразбирать примеры однострочников

Спасибо, посмотрю.

myredeyes
() автор топика

Очевидно книжки по обычному С с его библиотечными функциями не подходят

Может есть уже золотая классика?

K&R – то, что ты ищешь

В какие-то темы вроде математики над указателями вообще не вижу смысла сейчас углубляться.

Складывать числа умеешь? Умножение понимаешь? Это – вся математика над указателями. Си == работа с указателями, без понимания этого там делать нечего. Но там и понимать нечего: спроси тут – тебе пояснят. Но сначала прочти K&R

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

Вызвало НЕДОУМЕНИЕ на моменте вывода через write. Вместо числа i в консоли из цикла выводило символ соответствующий этому числу в ANSI. Попытки привести к типу и т.д. не помогали. Пришлось делать костыли, но очень тяжело мыслить в эту сторону, не знаю как подступаться к таким абстрактным ситуациям.

Вот вам «питонистам» не достает понимания того, как компьютер вообще работает. Как число в памяти хранится, как оно на экране рисуется. Поиграться бы тебе с микроконтролерами или спектрумом каким… Но это я так, брюжжу :)

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

Вместо числа i в консоли из цикла выводило символ соответствующий этому числу в ANSI.

Ну, так и должно быть. Вы же напрямую двоичное число пишете. Если нужно его представление в ANSI пишется код, печатающий число (остатки от деления на 10 преобразуются в соответствующий ANSI-символ).

Write a command line that displays the output of a cat /etc/passwd command, — это понятно
removing comments, — в смысле поле ″user name or comment ″?
every other line starting from the second line, — непонял
reversing each login, — на sed это сложно
sorted in reverse alphabetical order, — сортировка на sed??

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

Если у нас есть указатель, над которым мы собрались выполнять арифметику, значит размер того, на что он указывет, известен и sizeof() сработает.

зная общий размер данных и количество элементов

Что из этих двух величин является указателем?

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

Ничего, тебе и не говорили что деление указателей: тебе говорили что деление – часть математики над указателями.

Если у нас есть указатель, над которым мы собрались выполнять арифметику, значит размер того, на что он указывет, известен и sizeof() сработает

Справедливо, но это же не запрещает мне получить размер одного элемента делением :)

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

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

Думаю, что это не костыли, а как раз навыки системного программирования, которые от тебя и хотели.

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

K&R

Не надо его читать, оно устарело 30 лет назад. Может быть общие навыки от него и усвоятся, но параллельно усвоится ряд приёмов, которые применять НЕ надо, и потом придётся переучиваться на нормальный Си.

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

Не надо его читать, оно устарело 30 лет назад

Это в чем? Алгебра и геометрия вообще уже 2000 лет как устарели. Что в Си поменялось с 70-х? Человек боится арифметики с указателями.

параллельно усвоится ряд приёмов, которые применять НЕ надо, и потом придётся переучиваться на нормальный Си.

конкретику давай

что значит «нормальный Си»?

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

Комментарии - это строки, которые начинаются с #.

В файле /etc/passwd? То, что такой бред пропихнули в GNU libc не означает, что это стало стандартом. musl не понимает этого, а раньше и glibc спокойно считал символ '#' частью логина.

mky ★★★★★
()

«Pointers in C Programming: A Modern Approach to Memory Management, Recursive Data Structures, Strings, and Arrays»

Author(s): Thomas Mailund
Publisher: Apress, Year: 2021
ISBN: 9781484269268,9781484269275


«Modern C for Absolute Beginners: A Friendly Introduction to the C Programming Language»

Author(s): Slobodan Dmitrovic
Publisher: Apress
ISBN: 1484266420,9781484266427

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

Да нет, это не пропихнули. В линуксе по дефолту комментариев в этом файле нет, а вот в фрибсд они там есть в дефолтной установке. По-моему удобно неактивных юзеров отключать так в один клик.

firkax ★★★★★
()

По сишным указателям и массивам полно туториалов для самых маленьких. Я понимаю, синтаксис нечитабельный с этими * и &, но оно вполне задрачивается за разумное время. Общее понимание, как это в принципе работает и зачем так, лично я перед C получал из ассемблера, почему-то это показалось с дивана намного легче. Но то под DOS было, современный асм меня повергает в депрессию и безысходность :)

yu-boot ★★★★★
()
Ответ на: комментарий от firkax

По дефолту комментариев нет, но актуальный glibc игнорирует строки, начинающиеся с решётки. Не знаю точно когда это началось, в нулевых можно было редактируя этот файл создать пользователя ″#user" и команды id, su и т.д. его понимали. А сейчас, в с glibc ″#user" не существует, но не с musl и привычка коментить /etc/passwd в линуксе может выйти боком.

Не знаю FreeBSD, в man'е написано, что /etc/passwd генерится из master.passwd

А как при комментировании пользователя резервируется UID, чтобы ls отображал имя владельца файла, и чтобы не создался пользователь с таким же UID?

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

Так в master.passwd комментарии тоже разрешены и копируются оттуда в passwd. То есть там даже специальный функционал есть чтоб они не просто игнорировались, а и поддерживались в наличии в производных файлах.

А как при комментировании пользователя резервируется UID, чтобы ls отображал имя владельца файла, и чтобы не создался пользователь с таким же UID?

Думаю никак. Закомментированный юзер значит его нет. Если закомментировать последнего то наверно при автоматическом создании нового его uid может быть переиспользован. А вот дырки в середине вроде не используются.

Хотя может быть там и есть какая-то логика парсинга юзеров из комментариев.

firkax ★★★★★
()

Ты случайно не путаешь Столлмана со Столяровым?

Можешь попробовать вначале изучить паскаль, а уже потом перейти на Си, Столяров именно это и рекомендует и если ты начал сразу со второго тома, то ССЗБ.

Xenius ★★★★★
()

У меня же от чистого С с поинтерами и низкоуровневыми алгоритмами взрывается мозг.

Поставьте какой-нибудь хороший графический отладчик, вроде x64dbg или ollydbg, и поупражняйтесь на простом бинарнике а-ля hello world.

Мне наглядное графическое представление здорово помогло в изучении.

ValdikSS ★★★★★
()

CS

Counter Strike?

У меня же от чистого С с поинтерами и низкоуровневыми алгоритмами взрывается мозг.

На самом деле он проще высокоуровневых языков типа того же C++ или Java Script. За месяц можно только что-то типа Go освоить

uwuwuu
()
Ответ на: комментарий от yu-boot

Да вроде норм все под линуксом, не вижу сложностей, почти все как в DOS.

format elf64 executable 3
segment readable writeable executable

print_hello:
  mov rdx, msg.size ; string length
  mov rsi, msg      ; string address 
  mov edi, 1        ; stdout
  mov eax, edi      ; syscall #1
  syscall

terminate:
  mov eax, 60       ; syscall #60
  xor edi, edi      ; exit code 0
  syscall

msg db 'Hello World!', 0xA
msg.size = $ - msg

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

Экран через /dev/fb0, тоже просто пишешь пиксели в нужном формате.

Файлы читать писать через те же syscall, это же write() и read(), которым fd не важен, только нужно перед этим вызвать open() https://filippo.io/linux-syscall-table/

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

Хм, надо было присмотреться повнимательнее. Когда открыл код на gas уже давно не прикасаясь к асму, почитал ещё про апи «там всё только для сишников, на асме ужас-ужас» и резко расхотелось.

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

tasm умер, на 32 и 64 битных виндах не запустишь.

masm умер на версии 6.14 году так в 95-м.

У gas жуткий синтаксис, не видеть бы.

nasm вроде был ничего так, живой по крайней мере года 4 назад, многоплатформенный.

bugs-bunny
()
Ответ на: комментарий от yu-boot

Не надо смешивать в кучу коней и людей.

Для сишников - сишные библиотеки. Если их вызываешь из асма то сложности и т. д.

Сам асм под линукс нормальный, поскольку все можно делать через сисколлы. Это ровно то же самое что делали под досом через прерывание.

А вот под виндой приехали, с сисколлами там небольшая засада и придется дергать виндовые библиотеки с зубодробительным апи.

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

Популярные школы по всему миру с одинаковой программой и концептом P2P обучения. Что-то среднее между курсами и университетом. В РФ называется школа 21.

myredeyes
() автор топика

Могу объяснить чистый С за полминуты. Я изучал его полгода. Купил несколько книг и составлял программы. Если кто надеется изучить за 10 минут, то программирование - не для него. Работайте олигархом: ничего знать и уметь не нужно, только и делай, что греби деньги большой лопатой.

Partisan ★★★★
()