Статьи

Ввод и вывод данных в C, часть 2

Предыдущая статья о функциях ввода и вывода была посвящена функциям getchar()putchar()scanf() В этой статье будут обсуждаться функции printf()puts() Также будут обсуждаться некоторые основные программы, которые демонстрируют использование функций ввода / вывода.

Запись выходных данных: функция printf

Функция printf Общая форма printf

printf (управляющая строка, arg1, arg2,…, argN)

Строка управления состоит из одного или нескольких следующих элементов:

  • Символы, которые просто печатаются как есть; т.е. сообщения или подсказки
  • Спецификации конвертации — ширина поля и спецификатор формата
  • Escape-последовательности — используются для печати определенных непечатаемых символов, таких как перевод строки, табуляции и звонка

Строка управления указывает тип следующих аргументов. Аргументы arg1, arg2,…, argN — это переменные, значения которых форматируются и печатаются в соответствии со спецификациями управляющей строки. Аргументы должны соответствовать по количеству, порядку и типу спецификациям формата.

Пример:

  #include <stdio.h>

 int main ()

 {

 int marks = 412;

 процент с плавающей запятой = 85,4;

 printf ("n Marks =% d, n Percentage =% f", отметки, проценты);

 вернуть 0;

 }

 Выход:

 Marks = 412

 Процент = 85,4 

В вышеприведенной программе escape-последовательность n Спецификаторы формата %d %f markspercent Аргументы printfфактические значения, а не адреса, как в случае с scanf

Указание ширины поля в printf

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

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

  #include <stdio.h>

 int main ()

 {

 int i = 1234;

 поплавок х = 348,45;

 char a [];

 printf ("% 3d% 5d% 8d", i, i, i);

 printf ("% 7f% 7.1f% 7.3f", x, x, x);

 printf ("% 10s% 13s% 10,5s", a, a, a);

 вернуть 0;

 } 

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

Вывод первого оператора 1234    _1234  _ _ _ _1234

printf

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

Второй оператор printf Максимальное количество знаков после запятой, которые могут быть напечатаны, определяет точность поля. Точность — это целое число без знака, которое указывается после десятичной точки, следующей за минимальной шириной поля. Например, во втором операторе printf

Вывод второго оператора 348.450000    _ _348.5    348.450

a

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

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

Предположим, что массив символов printf Поэтому вывод третьего оператора _precision  _ _ _ _precision _ _ _ _ _preci

-

Указание флагов в printf:

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

Некоторые из наиболее часто используемых флагов:

  • +после элемента данных. По умолчанию числа печатаются с выравниванием по правому краю.
  • 0 Без этого флага только отрицательным элементам данных предшествует знак.
  • '  ' Применяется только к тем элементам данных, которые выровнены по правому краю в поле, минимальная ширина которого больше, чем у элемента данных.
  • # Этот флаг отменяется флагом +, если оба присутствуют.
  • #
  • puts Также предотвращает усечение конечных нулей при преобразовании g-типа.

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

  #include <stdio.h>

 int main ()

 {

 int i = 123;

 поплавок х = 12,0, у = -3,3;

 // По умолчанию выравнивание по правому краю чисел без флагов

 printf (":% 6d% 7.0f% 10.1e:");

 // Выровненный по левому краю показ через - флаг

 printf ("n:% - 6d% -7.0f% -10.1e:");

 // Добавление знака с правым выравниванием по умолчанию

 printf ("n:% + 6d% + 7.0f% + 10.1e:");

 // добавление знака (через + флаг) и выравнивания слева (через - флаг)

 printf (n:% - + 6d% - + 7.0f% - + 10.1e: ");

 // печатает число с плавающей запятой без десятичной дроби и усекает 0 с при преобразовании типа g

 printf (n:% 7.0f% 7g: ");

 // Включение десятичной точки в число с плавающей запятой и включение нулей в конце при преобразовании типа g:

 printf ("n:% # 7.0f% # 7g:");

 вернуть 0;

 } 

Вывод не требует пояснений. Двоеточие указывает начало и конец первого поля и последнего поля соответственно для каждой строки.

: 123 12 -3,3e + 00:

: 123 12 -3,3e + 00:

: +123 +12 -3.3e + 00:

: +123 +12 -3.3e + 00:

: 12 -3,3:

: 12. -3.30000:

Флаги — и + также могут использоваться для выравнивания строк.

Вывод символьной строки: функция put

Функция puts

Общая форма arrayname

ставит (ИмяМассив)

где puts Функция put возвращает EOF в случае ошибки записи; в противном случае он возвращает неотрицательное значение.

Функция puts Даже если спецификатор формата% s используется с printfputs

Подобно функции putsgets Он использовался для чтения массива символьных типов, включающего пробельные символы. Однако после вступления в силу стандартов C11 функция gets

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

Следующие программы иллюстрируют использование основных функций ввода / вывода, которые мы обсуждали до сих пор:

Пример 1

Пусть ab a=10b=20 Следующая программа обменивает или меняет значения двух переменных.

  #include <stdio.h>
 int main ()
 {
   int a = 10;
   int b = 20;
   int c;
   с = а;
   а = Ь;
   B = C;
   printf («После замены значения: n»);
   Е ( "А =% d", а);
   Е ( "пВ =% d", б);
   вернуть 0;
 } 
  Выход:

 После замены значения:
 А = 20
 В = 10 

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

Пример 2

Обмен значениями без использования третьей переменной:

  #include <stdio.h>
 int main ()
 {
   int a = 10;
   int b = 20;

   а = а + Ь;  // а = 30
   б = AB; // Ь = 30-10 = 20
   а = AB;  // а = 30-20 = 10
   Е ( "А =% d", а);
   Е ( "пВ =% d", б);
   вернуть 0;
 }

 Выход: 
 А = 20
 В = 10 

Вышеуказанная программа также может быть реализована с использованием операторов умножения (*) и деления (/).

Пример 3

Печать ASCII-кода символа и наоборот:

  #include <stdio.h>
 int main ()
 {
   буква символа = 'a';
   внутренний номер = 97;
   Е ( "% d", письмо);
   Е ( "% н с", число);
   вернуть 0;
 } 
  Выход:
 97
 

объяснение

Мы уже видели, что каждый символ имеет эквивалентный код ASCII и что символьные и целочисленные типы совместимы. Поэтому в указанной выше программе спецификатор формата% d печатает эквивалентный код ASCII буквы a.

Точно так же спецификатор формата% c печатает символ, эквивалентный ASCII-код которого равен 97. Эти знания можно использовать для преобразования буквы из прописных в строчные. То же самое было продемонстрировано в следующем примере.

Пример 4

Преобразование строчных букв в прописные:

  #include <stdio.h>
 int main ()
 {
   char c = 'a';
   int d;
   D = C-32;  // d = 97-32 = 65 (ASCII из 'A')
  Е ( "% С", д);  // печатает символьный эквивалент целочисленного значения, хранящегося в d
   вернуть 0;
 }
 Выход:
 

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

Следующая статья в этой серии начнется с обсуждения управляющих структур, которые включают в себя операторы принятия решений, операторы выбора и операторы итераций (циклы).