Это не очень интересно. Намного интереснее то, что функция printf() может получать любое количество аргументов и начальную управляющую строку, которая определяет, как вывести дополнительные аргументы. Объявление функции printf() в языке C выглядит следующим образом:

int printf(const char* format, ...);

Многоточие (...) означает “и, возможно, остальные аргументы”. Мы можем вызвать функцию printf() так:

void f1(double d, char* s, int i, char ch)

{

  printf("double %g string %s int %d char %c\n", d, s, i, ch);

}

где символы %g означают: “Напечатать число с плавающей точкой, используя универсальный формат”, символы %s означают: “Напечатать С-строку”, символы %d означают: “Напечатать целое число, используя десятичные цифры,” а символы %c означают: “Напечатать символ”. Каждый такой спецификатор формата связан со следующим, до поры до времени не используемым аргументом, так что спецификатор %g выводит на экран значение переменной d; %s — значение переменной s, %d — значение переменной i, а %c — значение переменной ch. Полный список форматов функции printf() приведен в разделе Б.10.2.

  К сожалению, функция printf() не является безопасной с точки зрения типов. Рассмотрим пример.

char a[] = { 'a', 'b' };      /* нет завершающего нуля */

void f2(char* s, int i)

{

  printf("goof %s\n", i);     /* неперехваченная ошибка */

  printf("goof %d: %s\n", i); /* неперехваченная ошибка */

  printf("goof %s\n", a);     /* неперехваченная ошибка */}

Интересен эффект последнего вызова функции printf(): она выводит на экран каждый байт участка памяти, следующего за элементом a[1], пока не встретится нуль. Такой вывод может состоять из довольно большого количества символов.

Недостаток проверки типов является одной из причин, по которым мы предпочитаем потоки iostream, несмотря на то, что стандартный механизм ввода-вывода, описанный в библиотеке stdio языков C и C++, работает одинаково. Другой причиной является то, что функции из библиотеки stdio не допускают расширения: мы не можем расширить функцию printf() так, чтобы она выводила на экран значения переменных вашего собственного типа. Для этого можно использовать потоки iostream. Например, нет никакого способа, который позволил бы вам определить свой собственный спецификатор формата %Y для вывода структуры struct Y.

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

int fprintf(FILE* stream, const char* format, ...);

Рассмотрим пример.

fprintf(stdout,"Hello, World!\n"); // идентично

                                   // printf("Hello,World!\n");

FILE* ff = fopen("My_file","w");   // открывает файл My_file

                                   // для записи

fprintf(ff,"Hello, World!\n");     // запись "Hello,World!\n"

                                   // в файл My_file

Дескрипторы файлов описаны в разделе 27.6.3.

<p id="AutBody_Root558"><strong>27.6.2. Ввод</strong></p>

Ниже перечислены наиболее популярные функции из библиотеки stdio.

int scanf(const char* format, ...); /* форматный ввод из потока stdin */

int getchar(void);      /* ввод символа из потока stdin */

int getc(FILE* stream); /* ввод символа из потока stream*/

char* gets(char* s);    /* ввод символов из потока stdin */

Простейший способ считывания строки символов — использовать функцию gets(). Рассмотрим пример.

char a[12];

gets(a); /* ввод данных в массив символов a вплоть до символа '\n' */

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже