Максимальное количество символов, печатаемых printf в C - PullRequest
0 голосов
/ 21 ноября 2018

В функции printf C при использовании этого под-спецификатора ширины форматера гигантской строки;близко к пределу стандарта положительный знак int;который указан ниже остальных форматов строк, игнорируется.

Пример формата строки:

printf("**%2147483614p %1073739618p This text and %d formatters are ignored!!! why**", &i, &j, 10);

вывод: **2147483614 empty spaces 0xbf ****** 1073739618 empty spaces

Проблема:

Текст "** Этот текст и 10 форматеров игнорируются !!! почему ****" и целое число 10 не отображается на экране.Он печатает полный первый% p с заполнением и заполнением, созданным спецификатором ширины для второго% p, но без указателя и оставшейся части строки для печати. ​​

Примечание: второй указатель может быть сделандля печати с левой настройкой формата, например

printf ("% - 2147483614p% -1073739618p Этот текст и% d средства форматирования игнорируются !!! Why **", & i, & j, 10); **

но строки по-прежнему отсутствуют.

Код

#include <stdio.h>

int main(int argc, char const *argv[]){
    printf(argv[1]);
    return 0;
}

x86_64-linux-gnu gcc версия 7.3.0

gcc printf.c -o printf

. / Printf "% - 2147483614p% -1073739618p Этот текст и% d средства форматирования игнорируются !!! почему "

PS Мне известно, что это утечка памяти


Обнаружено% 29p (29 - максимум, 30 не будет печататься) для второго указателя печатает остальную часть строки.но если в остальной части строки есть другой формат, он останавливается на этом.

1 Ответ

0 голосов
/ 21 ноября 2018

Если вы спрашиваете конкретно о спецификаторе максимальной ширины, в соответствии со стандартом C , §7.21.6.1.15 (который описывает fprintf; printf описанопозже в качестве особого случая fprintf):

Количество символов, которое может быть получено при любом отдельном преобразовании, должно быть не менее 4095.

Это означает, чтоесли, как вы сообщаете, максимальная ширина, которую printf вашей реализации C может обработать для спецификатора формата, прежде чем он перестанет работать, как и ожидалось, равна 0x7fffffe2, это допустимо, поскольку это удовлетворяет требованию по меньшей мере 4095 символов.

Что касается оставшейся части строки, не выводимой на печать, без MCVE, я бы рискнул предположить, что это побочный эффект от наличия таких бессмысленных значений ширины ранее в строке.Кроме того, %D не является допустимым спецификатором формата.

...