Подтвердить что ты не робот

Почему printf возвращает значение?

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

Каковы сценарии, в которых полезен статус возврата из printf?

4b9b3361

Ответ 1

Существует как минимум 2 использования возвращаемого значения printf:

  • Проверить наличие ошибок. Это редко бывает важно, когда ваш вывод является интерактивным или чисто информативным, но для программ, которые обрабатывают текст из stdio или файла и записывают результат в stdout, важно знать, является ли ошибка (например, полный диск, закрытая трубка или отбрасывается сетевое подключение) предотвращало запись всего вывода. Это особенно важно, если исходный файл будет удален/заменен выходом после завершения вывода. Однако из-за буферизации проверка результата printf сама по себе не является полезной. Вы захотите проверить ferror(stdout) после записи последнего вывода и промывки, чтобы получить достоверную информацию о том, произошли ли ошибки записи. С другой стороны, проверка возвращаемого значения printf позволяет вам обнаружить неудачу на раннем этапе, поэтому вы не тратите время на попытки написать миллионы строк, когда первая строка уже не удалась, поэтому это может быть очень полезная проверка; это просто не достаточная проверка сама по себе.

  • Если количество выводимых символов не очевидно, вы можете узнать, сколько символов было написано. Наивное использование этого числа было бы для выравнивания столбцов, но предполагая, что символы имеют фиксированную ширину в их визуальной презентации, довольно устарели. Это может иметь смысл, если вы форматируете исходный код. Другое подобное использование (не уверен, что это менее или устарело) заключается в написании полей фиксированной ширины в файле. Например, если ваши поля имеют 80 байт и printf возвращено 52, вы хотите записать еще 28 байтов заполнения, чтобы завершить поле.

Ответ 2

Существует несколько ситуаций, в которых вы можете проверить возвращаемое значение printf. Один из них - проверить ошибки, как вы упомянули; в то время как обычно нет ничего, что можно сделать, если есть ошибка на printf, вы можете, если вы печатаете что-то действительно большое, и получите сообщение об ошибке, решите попробовать его напечатать в меньших кусках.

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

snprintf() печатает в буфер фиксированного размера вместо stdout или файла. Он будет печатать только размер буфера, который вы ему даете; но возможно, что для печати полной строки потребуется больше места. Он возвращает объем пространства, необходимый для печати полной строки; таким образом, вы можете использовать возвращаемое значение для выделения нового буфера соответствующего размера и повторить попытку, если ваш исходный буфер был слишком мал. По этой причине вы почти всегда используете возвращаемое значение snprintf().

Ответ 3

Одной из основных причин, почему это используется, является устранение неполадок. Printf может использоваться для записи в файл (не только STDOUT). Обеспечение того, чтобы все персонажи были записаны в файл, имеет решающее значение в некоторых приложениях. Пример этого можно найти ниже:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  FILE *fp;

  printf("This will display on the screen.\n");

  if((fp=freopen("OUT", "w" ,stdout))==NULL) {
    printf("Cannot open file.\n");
    exit(1);
  }

  if( printf("This will be written to the file OUT.") < 0){
      return -1;
  }

  fclose(fp);

  return 0;
}

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

Ответ 4

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

Если возвращается неотрицательное значение (с указанием количества написанных символов), это означает, что операция прошла успешно. Если возвращается отрицательное число, произошла некоторая ошибка.

Например,

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int result = printf("This is a test!");
    if (result > 0)
    {
        printf("%d characters were written!", result);
        return EXIT_SUCCESS;
    }
    else return EXIT_FAILURE;
}

Ответ 5

Я тоже никогда не использовал возвращаемое значение. Но помимо проверки ошибок вы можете подсчитать количество символов, которые были выведены, сделать какую-то статистику или ограничение

Ответ 6

в некоторых случаях printf может вставлять часть вашей строки в stdout, и это не ошибка.

если вы должны быть уверены, что ваша строка будет выполнена, вы можете использовать возвращаемое значение, чтобы увидеть это.

его mos полезен при работе с fprintf и сокетами и т.д., но может быть полезен.