Как сделать перенос строки в c

Добавил пользователь Владимир З.
Обновлено: 05.10.2024

Новая строка или перевод строки или перенос строки или разделитель строк или символ конца строки (EOL) в информатике — специальный управляющий символ (или их последовательность), служащий для завершения или разделения строк в текстовых данных.

Содержание

Общие сведения

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

Следует различать ситуации, когда "новая строка" завершает строки, а когда - разделяет их. Если "новая строка" подразумевает отделение строк, то знак "новой строки" не ставится после последней строки файла. По общему соглашению, в большинстве систем "новая строка" добавляется даже после последней строки, т.е. трактуют "новую строку" как окончание строки. Некоторые программы имеют трудности с обработкой последней строки файла, если он не заканчивается символом новой строки. И наоборот, программы, ожидающие "новую строку" чтобы использовать ее как разделитель, интерпретируют последнюю "новую строку" как начало новой (пустой) строки. Это может привести к различиям в подсчете строк в файле, но во всем остальном это, в общем-то, безвредно.

В текстах, предназначенных для чтения людьми при помощи программ, использующих переносы слов, символ "новой строки" обычно необходим, только если перенос строки должен быть независим от положения следующего слова на этой же строке, как, например, между параграфами и вертикальными списками (см. жёсткий возврат и мягкий возврат)

Терминология

В случае принтера это означает сдвиг бумаги вверх, в случае дисплея — сдвиг курсора вниз если ещё осталось место, и прокрутку текста вверх если курсор находится на нижней строке.

Возвращается ли при этом курсор к левому краю или нет, зависит от реализации.

Представления и реализации

Программные приложения и операционые системы обычно представляют "новую строку" в виде одного или двух управляющих символов.

Краткие сведения

Системы, основанные на LF (от англ. Line feed (перевод строки), 0x0A) или CR (от англ. Carriage Return, 0x0D) по отдельности, или CR следует за LF (CR+LF, 0x0D 0x0A); см. ниже историческую причину для соглашения CR+LF. Эти символы основаны на командах принтера: перевод строки означает, что одна строка на бумаге должна быть перенесена при печати, а возврат каретки означает, что каретка печатающего устройства должна вернуться к началу текущей строки.

Основные цифровые реализации

  • LF (ASCII 0x0A) — используется в Unix и Unix-подобных операционнах системах (Linux, Xenix, Mac OS X, BeOS,
    • CR (ASCII 0x0D) — используется в машинах Commodore, Apple II, Mac OS до версии 9 и — используется в DEC CP/M, MP/M, OS/2, Microsoft Windows, Symbian OS, протоколах internet.

    Перевод строки в Unicode

    По стандарту, любое совместимое с Уникодом приложение должно воспринимать как перевод строки каждый из нижеследующих символов:

    • LF: подача строки, U+000A
    • CR: возврат каретки, U+000D
    • NEL: новая строка, U+0085
    • FF: новая страница, U+000C
    • LS: разделитель строк, U+2028
    • PS: разделитель абзацев, U+2029

    Последовательность CR LF (U+000D U+000A) надлежит воспринимать как один перевод строки (а не два) [1] .

    Трудности

    • Юникод старается примирить разницу представлений перевода строки, уравнивая CR, LF и CR LF, однако вступает в противоречие с наследуемым ASCII при трактовке LF CR, не предварённых CR: согласно ASCII это один перевод строки, а согласно Юникоду — два. Вероятно, Юникод сделал ставку на не существовавшие в ASCII разделители строк и абзацев, но они не прижились.
    • В зависимости от того, считать ли перевод строки её частью (завершителем) или не считать (считая их разделителем), после последней строки его ставят или нет. При пренебрежении одной из этих возможностей во время декодирования конец текста может стать неожиданным или появится лишняя пустая строка. Для сравнения, точка с запятой в Си команды завершает, а в Паскале разделяет.

    История

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

    На АЦПУ функции возврата каретки (головки) и подачи новой строки были разделены, откуда традиция представления перевода строки как CR LF перешла и к текстовым файлам.

    Некоторые исторические цифровые системы записи текста (например, при помощи перфокарт) вообще не использовали символ перевода строки.

    Примечания

    Дополнительные источники

    • The Unicode reference, see paragraph 5.8 in Chapter 5 of the Unicode 4.0 standard (PDF) - software for Unix that converts to and from DOS newlines : a Windows shell extension that is able to convert multiple files from DOS to UN*X (and vice-versa) line endings right from the context menu.

    Wikimedia Foundation . 2010 .

    Полезное

    Смотреть что такое "Перенос строки" в других словарях:

    ПЕРЕНОС СЛОВА — (wordwrap) Способность большинства текстовых редакторов (wordprocessors) автоматически переносить слово из конца строки на следующую строку, если это слово уже выходит за границу предельной длины строки. Бизнес. Толковый словарь. М.: ИНФРА М ,… … Словарь бизнес-терминов

    Перенос в математических формулах — разбивка не умещающейся в строку мат. формулы на части по строкам. Разделять формулы на части по строкам надо в первую очередь на знаках отношения между левой и правой частями формул (=, ≈, , ≤, ≥): во вторую на отточии, знаках сложения … Издательский словарь-справочник

    Перенос в химических формулах — разбивка не умещающейся в строку хим. формулы на части по строкам. Допускается только в случае крайней необходимости. Разбивку рекомендуется делать на знаках направления реакции (стрелках), знаках равенства, равновесия , взаимодействия (+ или –) … Издательский словарь-справочник

    ПЕРЕНОС — (анжанбеман) (французское enjambement, буквально перешагивание), крайний случай несовпадения членения на стихи (т.е. стихотворные строки) с естественным синтаксическим членением речи, когда синтаксическая пауза внутри стиха (или полустишия)… … Современная энциклопедия

    Перенос — (анжанбеман) (французское enjambement, буквально перешагивание), крайний случай несовпадения членения на стихи (т.е. стихотворные строки) с естественным синтаксическим членением речи, когда синтаксическая пауза внутри стиха (или полустишия)… … Иллюстрированный энциклопедический словарь

    Перенос (типографика) — У этого термина существуют и другие значения, см. перенос. Перенос в типографике разрыв части текста (слова, формулы и т. п.), при котором её начало оказывается на одной строке, а конец на другой. Содержание 1 Перенос слов 1 … Википедия

    перенос — ПЕРЕНО´С (франц. enjambement, от enjamber перешагнуть, перескочить) несовпадение интонационно фразового членения в стихе с метрическим членением, причем фраза (или часть ее, составляющая цельное синтаксическое сочетание), начатая в одном стихе,… … Поэтический словарь

    Перенос слова — Перенос в типографике разрыв части текста (слова, формулы и т. п.), при котором её начало оказывается на одной строке, а конец на другой. Содержание 1 Перенос слов 1.1 Знаки переноса 1.2 Осложненный перенос … Википедия

    перенос — (>фр. enjambement перенос) перенос части фразы из предшествующей стихотворной строки в последующую, вызванный несовпадением традиционно заканчивающей строку конечной стиховой паузы с паузой смысловой. На фоне ритмически правильных стихов П.… … Словарь литературоведческих терминов

    Всем привет, Только начал изучения языка си по книге С. Прата и столкнулся с непонятным для меня моментом, подскажите пожалуйста как это сделать правильно. Задание такое : "Напишите программу которая выдает следующие выходные данные : "Привет! Привет! Привет! Привет! Привет! Привет! " В программе должна быть определена функция, которая отображает строку " Привет! " один раз, в тоже время программа может использовать эту функцию столько раз, сколько потребуется. С определением функции вопросов не возникло, вопрос лишь в том как перенести строку при выводе этих функций? У меня все печатает в одну строку, буду рад за помощь, спасибо!

    10 голосов , оценка 4.200 из 5

    Пожалуйста, приостановите работу AdBlock на этом сайте.

    Итак, строки в языке Си. Для них не предусмотрено отдельного типа данных, как это сделано во многих других языках программирования. В языке Си строка – это массив символов. Чтобы обозначить конец строки, используется символ '\0' , о котором мы говорили в прошлой части этого урока. На экране он никак не отображается, поэтому посмотреть на него не получится.

    Создание и инициализация строки

    Так как строка – это массив символов, то объявление и инициализация строки аналогичны подобным операциям с одномерными массивами.

    Следующий код иллюстрирует различные способы инициализации строк.

    Объявление и инициализация строк

    Рис.1 Объявление и инициализация строк

    В первой строке мы просто объявляем массив из десяти символов. Это даже не совсем строка, т.к. в ней отсутствует нуль-символ \0 , пока это просто набор символов.

    Вторая строка. Простейший способ инициализации в лоб. Объявляем каждый символ по отдельности. Тут главное не забыть добавить нуль-символ \0 .

    Третья строка – аналог второй строки. Обратите внимание на картинку. Т.к. символов в строке справа меньше, чем элементов в массиве, остальные элементы заполнятся \0 .

    Четвёртая строка. Как видите, тут не задан размер. Программа его вычислит автоматически и создаст массив символов нужный длины. При этом последним будет вставлен нуль-символ \0 .

    Как вывести строку

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

    Различные способы вывода строки на экран

    Рис.2 Различные способы вывода строки на экран

    Как видите, есть несколько основных способов вывести строку на экран.

    • использовать функцию printf со спецификатором %s
    • использовать функцию puts
    • использовать функцию fputs , указав в качестве второго параметра стандартный поток для вывода stdout .

    Единственный нюанс у функций puts и fputs . Обратите внимание, что функция puts переносит вывод на следующую строку, а функция fputs не переносит.

    Как видите, с выводом всё достаточно просто.

    Ввод строк

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

    Функция gets приостанавливает работу программы, читает строку символов, введенных с клавиатуры, и помещает в символьный массив, имя которого передаётся функции в качестве параметра.
    Завершением работы функции gets будет являться символ, соответствующий клавише ввод и записываемый в строку как нулевой символ.
    Заметили опасность? Если нет, то о ней вас любезно предупредит компилятор. Дело в том, что функция gets завершает работу только тогда, когда пользователь нажимает клавишу ввод. Это чревато тем, что мы можем выйти за рамки массива, в нашем случае — если введено более 20 символов.
    К слову, ранее ошибки переполнения буфера считались самым распространенным типом уязвимости. Они встречаются и сейчас, но использовать их для взлома программ стало гораздо сложнее.

    Итак, что мы имеем. У нас есть задача: записать строку в массив ограниченного размера. То есть, мы должны как-то контролировать количество символов, вводимых пользователем. И тут нам на помощь приходит функция fgets :

    Функция fgets принимает на вход три аргумента: переменную для записи строки, размер записываемой строки и имя потока, откуда взять данные для записи в строку, в данном случае — stdin . Как вы уже знаете из 3 урока, stdin – это стандартный поток ввода данных, обычно связанный с клавиатурой. Совсем необязательно данные должны поступать именно из потока stdin , в дальнейшем эту функцию мы также будем использовать для чтения данных из файлов.

    Обратите внимание, функция fgets считывает не 10 символов, а 9 ! Как мы помним, в строках последний символ зарезервирован для нуль-символа.

    Давайте это проверим. Запустим программу из последнего листинга. И введём строку 1234567890 . На экран выведется строка 123456789 .

    Пример работы функции fgets

    Рис.3 Пример работы функции fgets

    Возникает вопрос. А куда делся десятый символ? А я отвечу. Он никуда не делся, он остался в потоке ввода. Выполните следующую программу.

    Вот результат её работы.

    Непустой буфер stdin

    Рис.4 Непустой буфер stdin

    Поясню произошедшее. Мы вызвали функцию fgets . Она открыла поток ввода и дождалась пока мы введём данные. Мы ввели с клавиатуры 1234567890\n ( \n я обозначаю нажатие клавиша Enter ). Это отправилось в поток ввода stdin . Функция fgets , как и полагается, взяла из потока ввода первые 9 символов 123456789 , добавила к ним нуль-символ \0 и записала это в строку str . В потоке ввода осталось ещё 0\n .

    Далее мы объявляем переменную h . Выводим её значение на экран. После чего вызываем функцию scanf . Тут-то ожидается, что мы можем что-то ввести, но т.к. в потоке ввода висит 0\n , то функция scanf воспринимает это как наш ввод, и записывается 0 в переменную h . Далее мы выводим её на экран.

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

    Теперь программа будет работать так, как надо.

    Сброс буфера stdin функцией fflush

    Рис.4 Сброс буфера stdin функцией fflush

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

    Второй. Не забывайте очищать буфер ввода, если используете функцию fgets .

    На этом разговор о вводе строк закончен. Идём дальше.

    Практика

    Решите предложенные задачи:


    Для удобства работы сразу переходите в полноэкранный режим

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

    Этот раздел относится к Visual Studio в Windows. Сведения по Visual Studio для Mac см. в разделе Редактор исходного кода: перенос по словам.

    Задание настроек переноса по словам

    В строке меню Visual Studio выберите Сервис, а затем Параметры.


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

    Выберите общие параметры в подпапке языка программирования.

    В разделе Параметры установите или снимите флажок Перенос по словам.

    Если установлен флажок Перенос по словам, включается параметр Показывать графические метки в местах переноса слов.

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

    Известные проблемы

    Если вы знакомы с переносом слов в Notepad ++, Sublime Text или Visual Studio Code, необходимо учитывать следующие моменты, когда Visual Studio работает не так, как другие редакторы.

    Читайте также: