首页 > 解决方案 > C 中 printf 可打印的最大字符数

问题描述

在 C 的 printf 函数中使用这个巨大的字符串格式化程序宽度子说明符;接近标准的限制一个正的有符号整数;下面提供的其余字符串格式将被忽略。

示例字符串格式:

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

输出:** 2147483614 empty spaces0xbf******1073739618 empty spaces

问题:

文本“**此文本和 10 个格式化程序被忽略!!!为什么****”和整数 10 不会显示在屏幕上。它打印完整的第一个 %p 及其填充和由第二个 %p 的宽度说明符创建的填充,但没有要打印的指针和字符串的其余部分。

注意:第二个指针可以通过向左调整格式说明符来打印,例如

printf(" %-2147483614p %-1073739618p 忽略此文本和 %d 格式化程序!!!为什么**", &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 不会打印)打印字符串的其余部分。但如果在字符串的其余部分有另一种格式刺痛,它就会停在那里。

标签: cstringprintfstring-formatting

解决方案


如果您具体询问最大宽度说明符,请根据C 标准§7.21.6.1.15(描述fprintf;printf稍后将其描述为 的特定情况fprintf):

任何一次转换可以产生的字符数至少应为 4095。

这意味着,如您报告的那样,如果您的 C 实现printf在格式说明符按预期停止工作之前可以处理的最大宽度为 0x7fffffe2,这是可以接受的,因为这满足至少 4095 个字符的要求。

至于字符串的其余部分没有被打印出来,如果没有 MCVE,我会冒险猜测它是在字符串中较早出现这种无意义的宽度值的副作用。此外,%D不是有效的格式说明符。


推荐阅读