Отладочная печать — это простой и достаточно эффективный метод поиска ошибок в программе. Он состоит в выводе (на экран или в файл) значениий переменных, вызовов функций, сообщений о выполнении итерации цикла или другой служебной информации в процессе работы программы. Результат этой печати представялет интерес для программиста, который пытается найти и исправить ошибку в программе.
Рассмотрим в качестве примера нашу простейшую программу. Предположим, что она работает неправильно, то есть выводит не максимальное значение (или вообще ничего не выводит). Самая сложная часть в этой программе — это цикл, который обрабатывает очередной элемент последовательности. Отладочная печать, которая может помочь разобраться в том, что же происходит в этом цикле, может быть добавлена следующим образом.
#include <stdio.h>
int main() {
int current = 0; /* текущий элемент последовательности */
int maximum = 0; /* максимальное значение на данный момент */
printf("Введите последовательность чисел и нажмите <Enter>\n");
printf("0 - символ конца последовательности\n");
/* Считываем первый элемент последовательности */
if(scanf("%d", ¤t) != 1 || current == 0) {
printf("Не удалось прочитать первый элемент\n");
return -1;
}
maximum = current;
/* Обрабатываем все остальные элементы */
while(scanf("%d", ¤t) == 1 && current != 0) {
fprintf(stderr, "Значение новго элемента последовательности current = %d\n", current);
fprintf(stderr, "Текущее значение максимума = %d\n", maximum);
if(current > maximum) {
maximum = current;
}
fprintf(stderr, "Значение максимума после сравнения = %d\n\n", maximum);
}
/* Печатаем ответ */
printf("Максимальное значение = %d\n", maximum);
return 0;
}
По сравнению с исходной версией в программе появились три строчки
вида fprintf(stderr, ...
. На каждой итерации цикла, то
есть при прочтении очередного элемента последовательности, на экран будет выводиться три строчки. Например:
Введите последовательность чисел и нажмите <Enter> 0 - символ конца последовательности 1 3 Значение новго элемента последовательности current = 3 Текущее значение максимума = 1 Значение максимума после сравнения = 3 5 Значение новго элемента последовательности current = 5 Текущее значение максимума = 3 Значение максимума после сравнения = 5 1 Значение новго элемента последовательности current = 1 Текущее значение максимума = 5 Значение максимума после сравнения = 5 0 Максимальное значение = 5Заметим, что вервое введенное число (1) не привло к печати сообщений, так как оно обрабатывается вне цикла
while
. После
введения второго элемента последовательности (3) происходит вывод
отладочной инофрмации.
Обратите внимание, что последний вызов fprintf
печатает
строчку и два символа перевода строки \n
. Это
позволяет сделать выдачу более наглядной, так как строки визуально
разделяются на группы, что позволяет быстрее разобраться в полученных данных.
stderr
. В отличие от "обычной"
печати printf("что-то")
, которая может быть выполнена
с задержкой по времени (так называемый буферизованный
ввод-вывод), печать в stderr выполняется сразу. То есть, если
Вы не видите текста своего сообщения, то значит эта
строчка fprintf(stderr, ...)
не выполнялась.