Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.66/88: Рейтинг темы: голосов - 88, средняя оценка - 4.66
 Аватар для SashaRasha
91 / 47 / 8
Регистрация: 08.10.2008
Сообщений: 445

Табуляция и пробелы

31.07.2019, 21:45. Показов 19636. Ответов 38
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Вопрос у меня появился. По каким принципам getchar рисует табуляцию? В консоли если ввести 1 символ и потом таб, то улетит на 7 пробелов, а если 7 символов то на 1. Ну тут в роде как не трудно догадаться, что 0 символов это 8 пробелов будет, а нет, 7. В общем, запутался сам.
И сразу еще один вопрос. Как посчитать програмно на сколько пробелов влепился таб?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.07.2019, 21:45
Ответы с готовыми решениями:

Табуляция функции
Как протабулировать функцию с помощью цикла for?

Циклы и табуляция функции
Подскажите пожалуйста с решением задачи Составить программу табулирования (вычисления значений) функции f (x) на отрезке с шагом h =...

Почему табуляция происходит по-разному?
#include "stdio.h" main() { int fahr, celsius; int lower, upper, step; lower = 0; upper = 300; step = 20; fahr =...

38
 Аватар для COKPOWEHEU
4148 / 2726 / 433
Регистрация: 09.09.2017
Сообщений: 12,080
05.08.2019, 12:08
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Байт Посмотреть сообщение
Потому-то я с ними и не согласен. Хотел было приобщиться к этой змеюке, язык интересный, мощный. Но вот этот момент меня сразу отвратил.
Аналогично. Сейчас вот встала задача, требующая применения скриптового языка. Самые известные, что я нашел - Питон и Луа. Но использование отступов в качестве ключевых слов мне слишком не нравится, поэтому Луа.
Цитата Сообщение от Байт Посмотреть сообщение
Еще один пример. Препроцессор Си.
Это не свойство препроцессора, точно так же можно в любом месте переносить:
C
1
2
  printf("str\
ing\n");
А препроцессор его всего лишь используют, поскольку нельзя разбивать одну директиву на несколько строчек. И вот это да, уже косяк препроцессора. Впрочем, косяков у него хватает.
0
2493 / 1157 / 709
Регистрация: 25.04.2016
Сообщений: 3,339
05.08.2019, 15:39
Байт, Catstail, Evg, COKPOWEHEU, Ethereal, ваше мнение о нужности табуляций никто не спрашивал. Создайте отдельную тему и флудите там сколько влезет. Особенно если вам не чего ответить непосредственно по вопросу ТС.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38223 / 21155 / 4314
Регистрация: 12.02.2012
Сообщений: 34,765
Записей в блоге: 14
05.08.2019, 16:12
stake-k26, а хамить не надо.
0
05.08.2019, 17:08

Не по теме:

stake-k26, учить, как вести себя - начинай с самого себя. Мы у тебя ни советов, ни поучений не просили.

0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
05.08.2019, 20:20
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Это не свойство препроцессора, точно так же можно в любом месте переносить:
Речь шла о таком коде:

C
#define AAA \
  int
AAA x;
если после обратного слэша поставить пробел, то по стандарту тест становится некорректным. Конкретно gcc такой код ест, но выдаёт предупреждение. clang аналогично, но скорее всего они содрали поведение с gcc. Sun'овский компилятор ломается

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

Добавлено через 1 минуту
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Питонеры с вами не согласятся, у них вся структуризация на отступах
Как я уже говорил, у людей временами случаются заскоки. А питонеры будут кричать, что это круто, просто потому, что это стадный инстинкт. На доводы о том, что так неудобно писать функции большого размера, обычно даётся стандартный ответ - не пишите больших функций. Собственно, ожидаемый ответ, когда возразить-то больше и нечем
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
05.08.2019, 22:22
Цитата Сообщение от Evg Посмотреть сообщение
у людей временами случаются заскоки.
Попробуем в этом заскоке разобраться. Да, люой уважающий себя и свой код программист будет выделять свои логические блоки отступами. В конце концов это дело стиля. Но делать стиль элементом языка - это круто. Я бы даже сказал - хамовато.
0
 Аватар для SashaRasha
91 / 47 / 8
Регистрация: 08.10.2008
Сообщений: 445
06.08.2019, 07:34  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
обычно даётся стандартный ответ - не пишите больших функций
Ну, это не без оснований.
"Первое правило: функции должны быть компактными. Второе правило: функции должны быть еще компактнее. Я не могу научно обосновать свое утверждение. Не ждите от меня ссылок на исследования, доказывающие, что очень маленькие функции лучше больших. Я могу всего лишь сказать, что я почти четыре десятилетия писал функции всевозможных размеров . Мне доводилось создавать кошмарных монстров в 3000 строк . Я написал бесчисленное множество функций длиной от 100 до 300 строк. И я писал функции от 20 до 30 строк. Мой практический опыт научил меня (ценой многих проб и ошибок), что функции должны быть очень маленькими. В 80-е годы считалось, что функция должна занимать не более одного экрана. Конечно, тогда экраны VT100 состояли из 24 строк и 80 столбцов, а редакторы использовали 4 строки для административных целей. В наши дни с мелким шрифтом на хорошем большом мониторе можно разместить 150 символов в строке и 100 и более строк на экране. Однако строки не должны состоять из 150 символов, а функции— из 100 строк. Желательно, чтобы длина функции не превышала 20 строк ."
Мартин Р. Чистый код

Не по теме:

А если говорить о Phyton, то я не думаю, что Google - это стадо, в котором долгое время работал создатель этого феноменального языка программирования. И это лично мое мнение и пусть каждый останется при своем мнении. И давайте не спорить по этому поводу, пожалуйста. Спасибо!

0
06.08.2019, 09:43

Не по теме:

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

Обычно обсуждение вопросов, никак не связанных с темой как раз и зовется флудом. И в данном случае такое обусждение уже скорее попадает под пункт 4.4 правил форума. на мой взгляд обсуждение стоит просто вынести в отдельную тему.

Байт, при всем уважении не вам об этом говорить.

0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
06.08.2019, 09:55
Цитата Сообщение от Evg Посмотреть сообщение
Я знаю только "язык", где табуляция имеет какое-то значение - это Makefile.
Цитата Сообщение от Evg Посмотреть сообщение
Ни в Си, ни в ассемблере, табуляция не нужна от слова "совсем".
Ну вы даже не догадываетесь зачем табуляция в ассемблере нужна. Вовсе не потому, что в ней какой-то смысл. Ну вот в Си табуляции неудобны потому-что если структура многократно вложена, то она будет уводиться табуляциями сильно вправо. А в ассемблере такого неудобства нет, потому-что всего четыре поля - метки, операции, параметров и комментария. Поэтому вреда от табуляции никакого, а вот скорость перемещения в редакторе по тексту она увеличивает в разы. Столбцов-то на экране больше, чем строк и вправо-влево идет перемещение на большее число позиций. И бежать по пробелам вправо-влево это кнопку стрелки нажать и держать. А с табуляциями никогда не приходится кнопки удерживать. Только быстрые нажатия тык-тык-тык без удержания. При табуляциях скорость перемещения курсора по строкам и столбцам как-бы выравнивается. И мышкой тоже не надо пользоваться и перекидывать руку с клавиатуры на мышь. Рука не глядя с символьных клавиш перекладывается на стрелки клавиатуры и в мгновенно в любую точку исходника. Ну не совсем мгновенно, а как раз так, что быстрее уже не надо. Так вот после того как привыкнешь так работать чей-то ассемблерный текст на пробелах сразу начинает бесить потому-что навигация курсором вправо-влево это блин кнопку стрелки нажимать, держать и ждать.
0
 Аватар для COKPOWEHEU
4148 / 2726 / 433
Регистрация: 09.09.2017
Сообщений: 12,080
06.08.2019, 10:01
Цитата Сообщение от Evg Посмотреть сообщение
Речь шла о таком коде:
Я про него и говорю: препроцессор только использует свойство объединения строк по слешу, но не предоставляет его. Мой пример как раз и демонстрирует, что это характерно для Си-шного кода в целом.
Цитата Сообщение от Evg Посмотреть сообщение
Как я уже говорил, у людей временами случаются заскоки. А питонеры будут кричать, что это круто
Да пусть пользуются если им удобно. Мне неудобно, я и не пользуюсь. Соответственно, обсуждать питон не собираюсь: я его не знаю.
Они, наверное, на нас с той же жалостью смотрят, мол отступы ничего не значат, как же они в своей лапше разбираются.
Цитата Сообщение от Байт Посмотреть сообщение
Но делать стиль элементом языка - это круто. Я бы даже сказал - хамовато.
Так может они от обратного плясали? Хороший программист сам расставит отступы чтобы было красиво, а плохой - нет. Так мы его заставим расставить отступы "правильно", иначе вообще не заработает. Вроде бы еще в Бейсике с этим развлекались.
0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
06.08.2019, 10:04
Цитата Сообщение от stake-k26 Посмотреть сообщение
Байт, Catstail, Evg, COKPOWEHEU, Ethereal, ваше мнение о нужности табуляций никто не спрашивал. Создайте отдельную тему и флудите там сколько влезет. Особенно если вам не чего ответить непосредственно по вопросу ТС.
Пардон только сейчас заметил. Ну раз так, так так.
А по вопросу ТC давно ответили. Неужто надо повторить ?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
06.08.2019, 10:54
Цитата Сообщение от SashaRasha Посмотреть сообщение
Ну, это не без оснований
Каждый программист сам себе выбирает, как ему писать код (в смысле стиля, оформления и т.п.). Кому-то удобны миллион коротких функций, кому-то одна длинная. А есть реальные случаи, когда функция на 10 страниц выглядит более понятно, чем если бы это было разбито на отдельные процедуры. В каждом конкретном случае программист решает сам. Если синтаксис языка не позволяет комфортно работать с кодом функции на 10 страниц, значит это плохой синтаксис. Какие бы оправдания этому не придумывали

Не по теме:

Цитата Сообщение от SashaRasha Посмотреть сообщение
А если говорить о Phyton, то я не думаю, что Google - это стадо
Лично на мой взгляд владельцы ойфонов - тоже стадо. Яблочная контора сказала "мы лучше вас знаем, что вам нужно" и все сказали "так точно". Аналогия не совсем правильная, но недалека от этого



Не по теме:

Цитата Сообщение от SashaRasha Посмотреть сообщение
И давайте не спорить по этому поводу, пожалуйста
Да тут не то чтоб спор. Скорее обсуждение дефектов проектирования. Мало ли на форуме присутствует будущий создатель какого-то очередного языка, который распространится на весь мир. А после такого обсуждения есть шансы того, что он не станет в синтаксис языка вносить какой-то бред, без которого вполне можно было бы обойтись



Цитата Сообщение от Ethereal Посмотреть сообщение
Ну вы даже не догадываетесь зачем табуляция в ассемблере нужна ....
Всё, что ты написал, я уже сказал в посте #16, но более кратко: "Она (табуляция) используется чисто как элемент форматирования для удобства человека и не более того". Т.е. она не вносит никакого функционального смысла ни в Си, ни в ассемблере (собственно, о чём начался изначальный разговор). Правда потом вспомнили про Makefile, где табуляция является именно функциональной составляющей, и тема разговора несколько поменяла направление

Не по теме:

Цитата Сообщение от stake-k26 Посмотреть сообщение
И в данном случае такое обусждение уже скорее попадает под пункт 4.4 правил форума
Иди уже записывайся в модераторы что ли... Такие люди там очень нужны



Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Я про него и говорю: препроцессор только использует свойство объединения строк по слешу, но не предоставляет его. Мой пример как раз и демонстрирует, что это характерно для Си-шного кода в целом
Честно говоря, мысль так и не понял. Ну да фиг с ним
1
 Аватар для COKPOWEHEU
4148 / 2726 / 433
Регистрация: 09.09.2017
Сообщений: 12,080
06.08.2019, 11:59
Цитата Сообщение от Evg Посмотреть сообщение
Честно говоря, мысль так и не понял. Ну да фиг с ним
В любом месте в коде на Си слеш обозначает "склеивание" со следующей строкой в одну. Например, если надо перенести строку (в смысле ASCIIZ).
C
1
2
printf("Str\
ing\n");
Препроцессор не умеет работать с объектами больше одной строки. Поэтому макросописатели пользуются предыдущим свойством и "обманывают" препроцессор, заставляя его думать, что длинный код из 10 строчек - одна длинная строка.
В результате, хотя перенос строки используется в основном в макросах, он там именно что используется. А характерен он именно для кода Си в целом. Ну и не только на Си, понятное дело: в том же makefile оно тоже работает.
Похожий принцип используется в ассемблерных вставках: там объединяют Си-шные строки, разделенные пробельными символами, а для собственно переноса используют символ переноса:
C
1
2
3
asm("cmd1 \r\n"
"cmd2 \r\n"
"cmd3 \r\n");
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
06.08.2019, 22:49
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
В любом месте в коде на Си слеш обозначает "склеивание" со следующей строкой в одну
В посте #21 ты привёл пример и сказал, что это не свойство препроцессора. Но в том примере - это тоже свойство препроцессора. Именно препроцессор заменяет вырезает обратный слэш и перенос строки внутри строкового литерала

Цитата Сообщение от Ethereal Посмотреть сообщение
Ну вы даже не догадываетесь зачем табуляция в ассемблере нужна
Кстати, ещё один момент. Ты немного перемешал в куче понятия "табуляция как элемент кодировки" и "условно клавиша TAB". Это не одно и то же. Чтобы поддержать свойство, которое ты описал, достаточно программно настроить соответствующим образом текстовый редактор. Чтобы нажатие кнопки TAB рисовало нужное количество пробелов. Чтобы нажатие стрелки вправо перемещало сразу на несколько пробелов. И так далее. Т.е. как бы сымитировать наличие символа табуляции. При этом сам символ табуляции (т.е. байт со значением 0x09) сам по себе остаётся избыточным. Собственно, изначально речь шла об этом
1
 Аватар для COKPOWEHEU
4148 / 2726 / 433
Регистрация: 09.09.2017
Сообщений: 12,080
07.08.2019, 10:45
Цитата Сообщение от Evg Посмотреть сообщение
Именно препроцессор заменяет вырезает обратный слэш и перенос строки внутри строкового литерала
Возможно. А в makefile? А в bash? Как бы то ни было, к макросам это не имеет прямого отношения.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
07.08.2019, 10:58
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А в makefile? А в bash? Как бы то ни было, к макросам это не имеет прямого отношения
Никто и не утверждает, что имеет. Изначально про препроцессор упомянули как пример кривого решения, когда лишние и невидимые глазу символы в тексте программы могут приводить к ошибкам, которые с непривычки очень сложно разбирать

Другими словами, есть дефекты проектирования (по другому я не могу это назвать) языков:
- табуляция в Makefile'ах
- обязательное требование, чтобы обратный слэш был последним символом в строке, а лишний хвостовой пробел всё ломает (препроцессор Си, Makefile, bash, наверное где-то ещё)
- отступы в python'е
- если повспоминать, наверняка ещё что-то найдётся

Эти дефекты описываются единым образом. Непечатные символы (т.е. те, которые в текстовом редакторе явно не видны) влияют на код программы. А самое главное - в таком идиотском поведении не было никакой реальной необходимости. Частично это придурь афторов, частично это попытка поставить формальную корректность (то бишь юридический аспект вопроса) поперёк здравого смысла. А по прошествии лет, когда стало ясно, что люди массово об эти проблемы спотыкаются, в интерпретаторы-компиляторы-прочее начинают вносить всяческие системы предупреждения, которые помогают человеку исправить ошибки в исходнике или которые как-то видоизменяют синтаксис. Это в очередной раз подтверждает, что с точки зрения грамматики языка все эти ситуации нормально распознаются и не было надобности изначально всё делать через задницу
2
 Аватар для COKPOWEHEU
4148 / 2726 / 433
Регистрация: 09.09.2017
Сообщений: 12,080
07.08.2019, 13:15
С такой формулировкой согласен. Разве что стоило бы выражаться менее категорично.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
07.08.2019, 14:14
Вспомнил, ешё в Фортране-77 нужно 6 пробелов ставить в начале строки, елси там нет метки. Правда здесь всё-таки была хоть какая-то реальная необходимость. Язык проектировался в те времена, когда памяти на машинах было очень мало, а подобные ограничения позволяли упростить код компилятора. И как-то это было связано с необходимостью работать с перфокартами (правда я совсем не знаю хоть какую-то конкретику)
0
10.08.2019, 07:13  [ТС]

Не по теме:

Цитата Сообщение от Evg Посмотреть сообщение
вносить какой-то бред, без которого вполне можно было бы обойтись
Если говорить о командной работе, то я не думаю, что PEP8 это бред.
Цитата Сообщение от Evg Посмотреть сообщение
Лично на мой взгляд владельцы ойфонов - тоже стадо. Яблочная контора сказала "мы лучше вас знаем, что вам нужно" и все сказали "так точно". Аналогия не совсем правильная, но недалека от этого
Не являюсь ярым поклоником эпла, но и против ничего сказать не могу. Во всяком случае это не какой-нить там роскомнадзор. Там люди реально работают и используют научный подход.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.08.2019, 07:13

Почему табуляция работает по-разному?
#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <time.h> int main (void) { int n; ...

Табуляция функций с использованием оператора цикла с постусловием do … while
Задача: Напишите и отладьте программу для табуляции следующих функций с использованием оператора цикла с постусловием do … while: ...

Настройка Android studio. Табуляция, пробелы
Не могу настроить Android Studio. :( Проблема в том, что Android Studio при форматировании заменяет табуляцию на пробелы перед...

Различия между "пробелы" и "табуляция"
Есть две статьи на хабре: в пользу табуляции и против я вообще не пойму сути проблемы: вот пишу я код, нужно на следущую строку -...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
39
Ответ Создать тему
Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru