Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Рацеев С.М. Программирование на языке Си.pdf
Скачиваний:
366
Добавлен:
23.03.2016
Размер:
1.65 Mб
Скачать

2.2. Форматный ввод-вывод

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

Функция printf() позволяет выводить на экран данные всех типов и принимать в качестве параметров несколько аргументов. Данная функция переводит внутреннее представление переменных (в памяти компьютера) в текстовый формат:

int printf(char *format, argument_1, argument_2,…, argument_n)

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

Основные преобразования функции printf():

Символ

Тип аргумента

%d (%i)

десятичное целое число

%u

беззнаковое целое число

%o

беззнаковое восьмеричное целое число

%x

беззнаковое шестнадцатеричное целое число

%f

действительное число типа float или double

%e

действительное число в экспоненциальной форме

%g

наиболее короткое представление действительного

 

числа (либо в формате %f, либо в экспоненциальном

 

формате %e)

%c

одиночный символ

%s

печать строки до символа ‘\0’ или в заданном

 

количестве символов

Чтобы задать ширину поля при выводе значения некоторой переменной, необходимо вставить целое число в спецификацию преобразования между знаком процента (%) и спецификатором

27

преобразования. Например, инструкция printf(“%10d”, 15) задает печать целого числа 15 с шириной поля 10.

Если необходимо задать точность представления, тогда следует поместить в спецификацию преобразования между знаком процента (%) и спецификатором преобразования десятичную точку (.), после которой ставится целое число, задающее точность представления данных. Например, после инструкции printf(“%.2f”, 0.14788) на экран выведется число 0.15.

Если точность представления используется при выводе строковой переменной, то это будет означать максимальное количество символов строки, которое будет напечатано. Например, после инструкции printf(“%.3s”, “abcde”) на экране появится слово abc.

Ширину поля и точность представления можно объединять,

например printf(“%10.2f”, 0.14788).

Ниже приведены примеры использования функции printf().

Инструкции

Результат на экране

printf(“%d”, 50);

50

printf(“a = %d”, 10);

a = 10

printf(“%o”, 9);

11

double a = 0.01, b = 1.1;

0.01 + 1.1 = 1.11

printf(“%.2f + %.2f = %.2f \n”, a, b, a+b);

 

char *s = “abc”;

s = abc

printf("s = %s”, s);

 

char s[] = “abc”;

s = ab

printf(“s = %.2s”, s);

 

printf(“s = %5.1s”, “abc”);

s = a

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

int sprintf(char *string, char *format, argument_1, argument_2,…, argument_n)

Например:

int main( )

{

char s[100];

28

sprintf(s, “a = %d”, 50); puts(s);

return 0;

}

После чего строка s будет иметь значение “a = 50”.

Форматный ввод. Функция scanf() читает символы из стандартного входного потока, интерпретирует их согласно формату и рассылает результаты в свои аргументы.

Int scanf(char *format, &argument_1, &argument_2,…, &argument_n)

В качестве результата функция scanf() возвращает количество успешно введенных элементов данных. Например:

int main( )

{

double x;

while (scanf(“%lf”, &x) == 1) printf(“%10.2f\n”, x);

return 0;

}

Рассмотрим, как работает функция scanf(). Пусть стандартный входной поток содержит последовательность символов. Сначала слева направо просматривается управляющая строка format. Если очередным символом данной строки является символ пробела ‘ ‘, либо символ табуляции ‘\t’, либо символ перехода на новую строчку ‘\n’ (данные символы будем называть пробельными), тогда во входном потоке пропускаются все подряд идущие пробельные символы, пока не встретится другой символ. Далее, если в управляющей строке format встретился формат, который начинается со знака %, то из входного потока читается последовательность подряд идущих символов до первого пробельного символа. Прочитанная последовательность символов преобразуется во внутреннее значение в памяти компьютера в соответствии с типом формата, которое передается по адресу очередного аргумента (&argument_i). Если в последовательности прочитанных символов встретился недопустимый символ для данного формата, тогда в соответствии с

29

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

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

Например, пусть функция scanf() имеет следующие аргументы: int a;

scanf(“a = %d”, &a);

Чтобы правильно ввести число в переменную a, необходимо ввести с клавиатуры строчку вида

a = 10

Одно из важных отличий функции scanf() от функций gets() и fgets() при вводе потока символов в строковую переменную s состоит в следующем. Функция scanf() читает символы из стандартного входного потока и записывает их в переменную s до тех пор, пока не встретится пробельный символ (‘ ’, ‘\t’, ‘\n’). Функции же gets() и fgets() записывают в строку s символы из входного потока, пока не встретится символ ‘\n’. Таким образом, нельзя с помощью функции scanf() ввести в переменную s некоторое предложение, содержащее пробельные символы.

Например, после определения строки char s[100] и инструкции scanf(“%s”, s) попытка ввести предложение “Привет, мир! \n” приведет к тому, что строка s будет содержать значение “Привет,”. Если вместо функции scanf() применить функцию gets(), то строка s будет содержать “Привет, мир!”. Если же в этом случае использовать функцию fgets(), то в строку s будет записано такое значение: “Привет, мир! \n”.

Функция sscanf() читает символы из строки string:

30

int scanf(char *string, char *format, &argument_1,…, &argument_n)

Данная функция просматривает строку string согласно формату format и передает полученные значения в argument_1, argument_2, …, argument_n.

Ниже перечислены типы данных и приведены спецификации преобразования для функций printf и scanf.

Тип

Спецификация

Спецификация

данных

преобразования

преобразования

 

для printf

для scanf

long double

%Lf

%Lf

double

%f

%lf

float

%f

%f

unsigned long long

%llu

%llu

long long

%ll

%ll

unsigned long

%lu

%lu

long

%ld

%ld

unsigned int

%u

%u

int

%d

%d

short

%hd

%hd

char

%c

%c

31