Как сделать пробел в printf

Обновлено: 01.07.2024

Есть ли способ напечатать определенное количество пробельных символов?

Я не могу использовать мин. ширина пробела "\"%-5s\"" потому что это приведет к "str ". и мне нужно вывести "str" .

Я знаю, что могу сделать это тупым путем:

Но я бы оценил более эффективный обходной путь.

Решение

Где ведущий и тянущийся int.
Только для трейлинга

Подобные модификации могут быть сделаны только для ведущих

РЕДАКТИРОВАТЬ
Спецификатор ширины позволяет использовать звездочку для обеспечения переменной ширины.
В этом случае% * c сообщает printf, чтобы получить следующий аргумент и использовать его в качестве ширины символа.
Первоначально он читает ведущий и использует его для ширины поля, в котором печатается символ, пробел. Затем печатается кавычка, \ «. Формат% s печатает следующий аргумент, стр. Другая печатная кавычка и затем снова% * c читает конечный символ в качестве ширины поля, в котором нужно напечатать следующий аргумент, другой пробел.

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

Но всё это реализовано уже очень давно. Страшно сказать, но функция printf празднует в следующем году 50-летний юбилей! Да этих функций и не могло не быть — на заре развития компьютеров и компиляторов единственным средством общения программы с человеком был текстовый ввод-вывод.

Эти функции лежат в библиотеке stdio, подключим её:

Итак, функция которая понадобится вам чаще всего — sprintf. Она принимает:

sprintf работает как шаблонизатор: она читает строку форматирования, находит в ней идентификаторы, подставляет на их место значения переданных параметров и выводит результат в *s.

В строке форматирования может быть несколько идентификаторов, тогда в качестве параметров должно быть передано такое же количество аргументов, и конечно они должны чётко соответствовать типу, указанному в идентификаторе.

Самые частые случаи

Чаще всего вам понадобятся:

Можно добавлять управляющие последовательности, например \n — перевод строки.

Описание

Ни один из элементов не является обязательным, кроме типа. Часть элементов относятся только к некоторым типам, например ширина, точность и размер — только к числовым типам.

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

Числовые целые типы

%d/%i, %u, %o, %x/%X — всё это типы целых чисел int (т.е. оно имеет длину равную разрядности платформы).

%d и %i — десятичное целое знаковое число, минус ставится только у отрицательных чисел.

%u — десятичное целое беззнаковое число.

%o — восьмеричное представление int.

%x — шестнадцатиричное представление int в строчном формате: 0..9, a..f.

%X — шестнадцатиричное представление int в прописном формате: 0..9, A..F.

К ним можно применить модификаторы размера:

%l — число интерпретируется как long int = int16_t

%ll — long long int = int32_t

Флаги:

%-d — выравнивание числа по левому краю

И размерность:

%2d — длина числа минимум 2 символа. Если меньше — оно будет дополнено слева пробелами (либо нулями, если есть флаг 0)

Я очень часто использую идентификатор %02X для вывода шестнадцатиричных чисел в пакетах данных, например:

Типы с плавающей точкой

%e — экспоненциальная запись

Модификатор размера только один:

К ним можно применить те же самые флаги 0 и -, а также можно указать ширину и точность:

%.2f — выведет float с двумя знаками после запятой. Если они равны 0 — они всё равно будут выведены, поэтому так можно делать красиво выровненные таблички.

%10.2f — как и в прошлой главе, дополнит число нулями или пробелами до длины 10 символов.

Символы

%c выводит символ с кодом, переданным в качестве параметра.

Строки

%s выводит переданную строку, вплоть до её терминирующего нуля.

Особые типы

%n записывает в переданную переменную счётчик символов — количество символов, которое было выведено на момент появления этого идентификатора.

%p выводит адрес указателя.

Варианты функций printf

Мы уже рассмотрели функцию sprintf, как наиболее полезную при программировании под МК — она выводит текст в переданный указатель на строку. Но это не единственная функция из семейства:

  • printf(char *format, …) — выводит текст в стандартный вывод (STDIO). Больше применима при программировании для компьютера, но в принципе вы можете переопределить встроенную функцию putc, чтобы она выводила символ как-то по-другому — и сможете, например, выводить через printf напрямую на ЖК-экран.
  • snprintf(char *s, int n, char *format, …) — ограничивает количество выведенных символов параметром n, непоместившиеся символы будут потеряны. Очень полезно, если у вас есть какой-то накопительный буфер, который нельзя переполнять.
  • fprintf(FILE *f, char *format, …) — выводит текст в файл. Опять же, в основном используется на ПК, но опять же вы можете переопределить её и, например, выводить данные в SD-карту.
  • vprintf(char *format, va_list va) — использует перечень аргументов variable arguments. Это просто незаменимая фича при написании своей обёртки вокруг printf.

Все функции вида printf возвращают количество записанных символов.

scanf

Функция, обратная sprintf — это sscanf. Она принимает строку с данными и текстом, пытается её разобрать в соответствии со строкой форматирования, и записывает найденные данные по переданным адресам. Простейший пример:

Здесь действуют все те же самые правила составления идентификаторов, что и в printf, и есть все те же самые функции вроде scanf, fscanf, sscanf.

В этом уроке мы продемонстрируем различные примеры форматирования с помощью метода printf () |/.

Метод является частью класса java.io.PrintStream и обеспечивает строгое форматирование, аналогичное функции printf() в C.

Дальнейшее чтение:

Руководство по java.util.Форматирующее устройство

Руководство по DateTimeFormatter

Заполните строку нулями или пробелами в Java

2. Синтаксис

Мы можем использовать один из этих методов PrintStream для форматирования выходных данных:

Мы задаем правила форматирования с помощью параметра формат . Правила начинаются с символа % .

Давайте рассмотрим краткий пример, прежде чем мы углубимся в детали различных правил форматирования:

Это приводит к следующему результату:

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

2.1. Правила Форматирования

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

Спецификаторы в скобках являются необязательными.

Внутренне printf() использует java.util.Форматер класс для анализа строки формата и создания выходных данных. Дополнительные параметры строки формата можно найти в файле Форматирования Javadoc .

2.2. Символы Преобразования

То преобразование-символ требуется и определяет, как форматируется аргумент.

Символы преобразования допустимы только для определенных типов данных. Вот некоторые из наиболее распространенных:

  • s форматирует строки.
  • d форматирует десятичные целые числа.
  • f форматирует числа с плавающей запятой.
  • t форматирует значения даты/времени.

Мы рассмотрим их и несколько других позже в этом уроке.

2.3. Дополнительные Модификаторы

[Флаги] определяют стандартные способы изменения выходных данных и наиболее распространены для форматирования целых чисел и чисел с плавающей запятой.

[Ширина] задает ширину поля для вывода аргумента. Он представляет минимальное количество символов, записанных в вывод.

[.точность] указывает количество цифр точности при выводе значений с плавающей запятой. Кроме того, мы можем использовать его для определения длины подстроки для извлечения из Строки .

3. Разделитель Строк

Чтобы разбить строку на отдельные строки, у нас есть спецификатор % new :

Приведенный выше фрагмент кода приведет к следующему результату:

То %n разделитель printf() автоматически вставит собственный разделитель строк хост-системы.

4. Логическое Форматирование

Для форматирования логических значений мы используем формат %b . Это работает следующим образом: если входное значение true , то выходное значение true . В противном случае вывод будет false .

Итак, если мы сделаем следующее:

тогда мы посмотрим:

Обратите внимание, что мы можем использовать %B для форматирования в верхнем регистре.

5. Форматирование Строк

Чтобы отформатировать простую строку, мы будем использовать комбинацию %s . Кроме того, мы можем сделать строку в верхнем регистре:

И это результат:

Кроме того, чтобы указать минимальную длину, мы можем указать ширину :

Если нам нужно оправдать нашу строку слева, мы можем использовать – флаг :

Это и есть результат:

Более того, мы можем ограничить количество символов в наших выходных данных, указав точность :

Первое x число в %x.y s синтаксис-это заполнение. y – это количество символов.

Для нашего примера здесь выводится Привет .

6. Форматирование Символов

Результатом %c является символ Юникода:

Заглавная буква C будет прописной в результате:

Но если мы дадим ему недопустимый аргумент, то Форматер выдаст Исключение IllegalFormatConversionException .

7. Форматирование Чисел

7.1. Целочисленное Форматирование

Метод printf() принимает все целые числа, доступные в языке — байт , короткий , int , длинный и BigInteger , если мы используем %d :

С помощью символа d мы получим такой результат:

В случае, если нам нужно отформатировать наш номер с разделителем тысяч, мы можем использовать флаг , |//. И мы также можем отформатировать наши результаты для разных регионов:

Как мы видим, форматирование в США отличается от форматирования в Италии:

7.2. Плавающее и двойное форматирование

Чтобы отформатировать число с плавающей точкой, нам понадобится формат f :

Конечно, первое, что приходит на ум, – это контролировать точность :

Здесь мы определяем ширину нашего числа как 5 , а длина десятичной части равна 2:

Здесь у нас есть отступ в один пробел от начала числа для поддержки заданной ширины.

Чтобы получить наш вывод в научной нотации, мы просто используем символ преобразования e :

И это наш результат:

8. Форматирование даты и времени

Для форматирования даты и времени строка преобразования представляет собой последовательность из двух символов: t или T символ и суффикс преобразования.

Давайте рассмотрим наиболее распространенные символы суффиксов форматирования времени и даты с примерами.

Определенно, для более продвинутого форматирования мы можем использовать DateTimeFormatter, который доступен с Java 8.

8.1. Форматирование Времени

Во-первых, давайте посмотрим список некоторых полезных символов суффикса для форматирования времени:

  • Символы H,M,Sотвечают за извлечение часов, минут и секунд из ввода Даты .
  • L , N представляют время в миллисекундах и наносекундах соответственно.
  • pдобавляет форматирование утра/вечера.
  • zвыводит смещение часового пояса.

Теперь предположим, что мы хотим распечатать временную часть Даты :

Приведенный выше код вместе с комбинацией %tT выдает следующий результат:

В случае, если нам потребуется более подробное форматирование, мы можем запросить различные временные сегменты:

Используя H , M и S , мы получаем этот результат:

Однако перечисление даты несколько раз-это боль.

В качестве альтернативы, чтобы избавиться от нескольких аргументов, мы можем использовать ссылку на индекс нашего входного параметра, которая в нашем случае равна 1$ :

Здесь мы хотим в качестве выходных данных текущее время, утра/вечера, время в миллисекундах и наносекундах, а также смещение часового пояса:

8.2. Форматирование Даты

Как и форматирование времени, у нас есть специальные символы форматирования для форматирования даты:

  • Aраспечатывает полный день недели.
  • d форматирует двузначный день месяца.
  • Bэто для полного названия месяца.
  • m форматирует двузначный месяц.
  • Yвыводит год в четырехзначном виде.
  • y выводит две последние цифры года.

Предположим, мы хотим показать день недели, за которым следует месяц:

Затем, используя A , B и Y , мы получим этот вывод:

Чтобы все наши результаты были в числовом формате, мы можем заменить A , B , Y буквы на d , m , y :

9. Заключение

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


ВведениеСтандартная библиотека C/C++ включает ряд функций для чтения и записи на консоли (клавиатура и монитор). Эти функции читают и пишут данные как простой поток символов.

Функция стандартного вывода printf()

Функция printf() является функцией стандартного вывода. С помощью этой функции можно вывести на экран монитора строку символов, число, значение переменной…

Функция printf() имеет прототип в файле stdio.h
int printf(char *управляющая строка, …);

В случае успеха функция printf() возвращает число выведенных символов.

Управляющая строка содержит два типа информации: символы, которые непосредственно выводятся на экран, и спецификаторы формата, определяющие, как выводить аргументы.

Функция printf() это функция форматированного вывода. Это означает, что в параметрах функции необходимо указать формат данных, которые будут выводиться. Формат данных указывается спецификаторами формата. Спецификатор формата начинается с символа % за которым следует код формата.

Спецификаторы формата:

символ
%d целое десятичное число
%i целое десятичное число
%e десятичное число в виде x.xx e+xx
%E десятичное число в виде x.xx E+xx
%f десятичное число с плавающей запятой xx.xxxx
%F десятичное число с плавающей запятой xx.xxxx
%g %f или %e, что короче
%G %F или %E, что короче
%o восьмеричное число
%s строка символов
%u беззнаковое десятичное число
%x шестнадцатеричное число
%X шестнадцатеричное число
%% символ %
%p указатель
%n указатель

Кроме того, к командам формата могут быть применены модификаторы l и h.

%ld печать long int
%hu печать short unsigned
%Lf печать long double

В спецификаторе формата, после символа % может быть указана точность (число цифр после запятой). Точность задаётся следующим образом: %.n . Где n — число цифр после запятой, а — один из кодов приведённых выше.

Например, если у нас есть переменная x=10.3563 типа float и мы хотим вывести её значение с точностью до 3-х цифр после запятой, то мы должны написать:

Результат:
Переменная x = 10.356

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

Например, если вы напишите:

то результат будет следующим:
20

Обратите внимание на то, что число 20 напечаталось не с самого начала строки. Если вы хотите чтобы неиспользованные места поля заполнялись нулями, то нужно поставить перед шириной поля символ 0.

Кроме спецификаторов формата данных в управляющей строке могут находиться управляющие символы:

Чаще всего вы будете использовать символ \n. С помощью этого управляющего символа вы сможете переходить на новую строку. Посмотрите примеры программ и вы всё поймёте.

Примеры программ.

Результат работы программы:
a=5, b=6, c=9

void main(void)
float x,y,z;

Результат работы программы:
Координаты объекта: x:10.50, y:130.67, z:54.00

Результат работы программы:
x=10

void main(void)
int a;

Результат работы программы:
a-dec=11, a-hex=b

void main(void)
char ch1,ch2,ch3;

Результат работы программы:
ABC

Результат работы программы:
Это Моя строка.

Результат работы программы:
Здравствуйте!
Меня зовут Павел.

Функция стандартного ввода scanf()

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

Функция scanf() имеет следующий прототип в файле stdio.h:
int scanf(char *управляющая строка);

Функция возвращает число переменных которым было присвоено значение.

Управляющая строка содержит три вида символов: спецификаторы формата, пробелы и другие символы. Спецификаторы формата начинаются с символа %.

Спецификаторы формата:

%c чтение символа
%d чтение десятичного целого
%i чтение десятичного целого
%e чтение числа типа float (плавающая запятая)
%h чтение short int
%o чтение восьмеричного числа
%s чтение строки
%x чтение шестнадцатеричного числа
%p чтение указателя
%n чтение указателя в увеличенном формате

char *gets( char *buf );

С помощью функции gets() вы сможете вводить полноценные строки. Функция gets() читает символы с клавиатуры до появления символа новой строки (\n). Сам символ новой строки появляется, когда вы нажимаете клавишу enter. Функция возвращает указатель на buf. buf — буфер (память) для вводимой строки.

Хотя gets() не входит в тему этой статьи, но всё же давайте напишем пример программы, которая позволяет ввести целую строку с клавиатуры и вывести её на экран.

void main(void)
char buffer[100]; // массив (буфер) для вводимой строки

Ещё одно важное замечание! Для ввода данных с помощью функции scanf(), ей в качестве параметров нужно передавать адреса переменных, а не сами переменные. Чтобы получить адрес переменной, нужно поставить перед именем переменной знак &(амперсанд). Знак & означает взятие адреса.

Что значит адрес? Попробую объяснить. В программе у нас есть переменная. Переменная хранит своё значение в памяти компьютера. Так вот адрес, который мы получаем с помощью & это адрес в памяти компьютера где храниться значение переменной.

Давайте рассмотрим пример программы, который показывает нам как использовать &

void main(void)
int x;

Теперь давайте вернёмся к управляющей строке функции scanf(). Ещё раз:

int scanf(char *управляющая строка);

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

Разделителями между двумя вводимыми числами являются символы пробела, табуляции или новой строки. Знак * после % и перед кодом формата (спецификатором формата) дает команду прочитать данные указанного типа, но не присваивать это значение.

при вводе 50+20 присвоит переменной i значение 50, переменной j — значение 20, а символ + будет прочитан и проигнорирован.

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

указывает необходимость прочитать из потока ввода первые 5 символов. При вводе 1234567890ABC массив str будет содержать только 12345, остальные символы будут проигнорированы. Разделители: пробел, символ табуляции и символ новой строки — при вводе символа воспринимаются, как и все другие символы.

Если в управляющей строке встречаются какие-либо другие символы, то они предназначаются для того, чтобы определить и пропустить соответствующий символ. Поток символов 10plus20 оператором

присвоит переменной x значение 10, переменной y — значение 20, а символы plus пропустит, так как они встретились в управляющей строке.

Одной из мощных особенностей функции scanf() является возможность задания множества поиска (scanset). Множество поиска определяет набор символов, с которыми будут сравниваться читаемые функцией scanf() символы. Функция scanf() читает символы до тех пор, пока они встречаются в множестве поиска. Как только символ, который введен, не встретился в множестве поиска, функция scanf() переходит к следующему спецификатору формата. Множество поиска определяется списком символов, заключённых в квадратные скобки. Перед открывающей скобкой ставиться знак %. Давайте рассмотрим это на примере.

На экране программа выдаст:
12345
abcdefg456

Можно также определить символы, которые не входят в множество поиска. Перед первым из этих символов ставиться знак ^. Множество символов различает строчные и прописные буквы.

Напомню, что при использовании функции scanf(), ей в качестве параметров нужно передавать адреса переменных. Выше был написан код:

Обратите внимание на то, что перед str не стоит символ &. Это сделано потому, что str является массивом, а имя массива — str является указателем на первый элемент массива. Поэтому знак & не ставиться. Мы уже передаем функции scanf() адрес. Ну проще говоря str это адрес в памяти компьютера где будет храниться значение первого элемента массива.

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