2017-01-09 17 views
-6

Скажем, я использовал printf без прохождения достаточно аргументов, чтобы соответствовать спецификаторам формата:Что будет делать printf, если недостаточно аргументов?

#include <stdio.h> 

int main(void) { 
    printf("missing argument: %s\n"); 
} 

Существует ли какая-либо гарантия на то, что результат будет?
На моей машине ничего не печатается вообще.
Это всегда так, или есть ли возможность напечатать строку с помощью разрешенного спецификатора?

, например: missing argument: %s

или: missing argument:

+10

поведение будет неопределенным. –

+3

Это UB, поэтому нет никакого стандарта относительно того, что он будет делать. –

+1

Компилятор может выдать предупреждение, но, во всяком случае, строка формата не известна во время компиляции. Рассмотрим 'printf (s, 1, 2);' – AlexD

ответ

5

: C спецификация явно на данный момент:

... Если нет достаточных аргументов для формата, то поведение не определено. ...
C11dr §7.21.6.1 2

Существуют ли какие-либо гарантии на то, что результат будет? - есть> Нет

потенциал для него, чтобы напечатать строку с разрешенным спецификатором -> Нет

(. На моей машине, ничего не печатается вообще) Всегда ли это так? -> Да. Поведение не определено. все может случиться.

1

printf reference состояния, проходящие меньше аргументов, чем указано в урожайности формате непредсказуемое поведение:

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