
Рис. 4.9. Передача аргументов
142 Глава 4
Возвращаемое значение функции printf()
Как упоминалось в главе 2, функция в языке С в общем случае имеет возвращаемое значение — это то, что она вычисляет и возвращает в вызывающую программу. Например, в библиотеке С содержится функция sqrt(), которая принимает число в качестве аргумента и возвращает его квадратный корень. Возвращаемое значение может быть присвоено переменной, участвовать в вычислениях, передаваться как аргумент — словом, им можно манипулировать подобно любому другому значению. Функция printf() также имеет возвращаемое значение — количество выведенных символов. Если произошла ошибка вывода, printf() возвратит отрицательное значение. (Некоторые старые версии printf() имели другие возвращаемые значения.)
Возвращаемое значение функции printf() является побочным эффектом ее главной задачи вывода данных и обычно не используется. Единственной причиной работы с возвращаемым значением printf() является необходимость проведения проверки на предмет наличия ошибок вывода. Чаще всего это делается при записи в файл, а не при выводе на экран. Например, если запись на CD- или DVD-диск невозможна из-за его переполнения, программа могла бы предпринимать подходящее действие, такое как выдача звукового сигнала в течение 30 секунд. Тем не менее, прежде чем можно будет реализовать это, необходимо изучить условный оператор if. Простой пример в листинге 4.13 демонстрирует работу с возвращаемым значением.
Листинг 4.13. Программа prntva1.с

Вот вывод этой программы:
Вода закипает при 212 градусах по Фаренгейту.
Функция printf() вывела 4 6 символов.
Во-первых, для присваивания возвращаемого значения переменной rv в программе применяется оператор вида rv = printf (...);. Он решает две задачи: выводит информацию и присваивает значение переменной. Во-вторых, обратите внимание, что итоговый результат включает все выведенные символы, в том числе пробелы и невидимый символ новой строки.
Вывод ДЛИННЫХ строк
Иногда операторы printf() оказываются слишком длинными, чтобы уместиться в одной строке файла исходного кода. Поскольку в языке С пробельные символы (символы пробела, табуляции и новой строки) игнорируются во всех случаях кроме ситуации, когда они используются для разделения элементов, оператор можно разнести на несколько строк, при условии, что разрывы строк размещаются строго между элементами.
Символьные строки и форматированный ввод-вывод 143
Например, в листинге 4.13 оператор printf() находится в двух строках:
printf("Функция printf() вывела %d символов.\n", rv);
В данном случае строка разбита между элементами запятой и rv. Чтобы показать читателю кода, что строка имеет продолжение, применяется отступ. Эти избыточные пробелы в С игнорируются.
Однако нельзя разрывать строку внутри кавычек. Предположим, что вы пытаетесь сделать что-то в этом роде:
printf("Функция printf() вывела %d символов.\n", rv);
В таком случае компилятор сообщит об использовании недопустимого символа в строковой константе. Вы можете включить в строку символ \n, чтобы обозначить символ новой строки, но не можете иметь внутри строки действительный символ новой строки, сгенерированный нажатием клавиши ().
Когда требуется разбить строку, для этого существуют три возможности, продемонстрированные в листинге 4.14.
Листинг 4.14. Программа longstrg.c

В результате выполнения программы получается следующий результат:
Вот один из способов вывода длинной строки.
Вот второй способ вывода длинной строки.
А вот самый новый способ вывода длинной строки.
Первый метод предусматривает применение более одного оператора printf(). Поскольку первая выведенная строка не заканчивается символом \n, вторая строка продолжается с конца первой.
Второй метод предполагает завершение первой строки комбинацией обратной косой черты и нажатия клавиши . Это приводит к тому, что текст на экране начинается с новой строки, но не помещает символ новой строки внутрь строки. В результате строка продолжается на следующей строке экрана. Однако, как видно в листинге, следующая строка экрана должна начинаться с крайней левой позиции. Если вы добавите отступ длиной, скажем, пять пробелов, то эти пять пробелов станут частью строки.
Читать дальше