c - C 中 printf 可打印的最大字符数
问题描述
在 C 的 printf 函数中使用这个巨大的字符串格式化程序宽度子说明符;接近标准的限制一个正的有符号整数;下面提供的其余字符串格式将被忽略。
示例字符串格式:
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 格式化程序!!!为什么**", &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 不会打印)打印字符串的其余部分。但如果在字符串的其余部分有另一种格式刺痛,它就会停在那里。
解决方案
如果您具体询问最大宽度说明符,请根据C 标准§7.21.6.1.15(描述fprintf
;printf
稍后将其描述为 的特定情况fprintf
):
任何一次转换可以产生的字符数至少应为 4095。
这意味着,如您报告的那样,如果您的 C 实现printf
在格式说明符按预期停止工作之前可以处理的最大宽度为 0x7fffffe2,这是可以接受的,因为这满足至少 4095 个字符的要求。
至于字符串的其余部分没有被打印出来,如果没有 MCVE,我会冒险猜测它是在字符串中较早出现这种无意义的宽度值的副作用。此外,%D
不是有效的格式说明符。
推荐阅读
- spring - 类路径资源中定义的名称为“employeesJob”的无效 bean 定义:工厂 bean 引用指向相同的 bean 定义
- python - 用于检查字谜数量的 Python 优化循环
- node.js - Microsoft Graph API /beta/me/findRooms 不适用于应用程序?
- sql - 如何识别是否有任何子程序失败?
- reactjs - 我的 hello world React 没有出现
- android - 如何增加图像文件名firebase
- python - 关于 Visual Studio Code 上的 Python
- c# - 传递成员名称作为参数
- javascript - 停止加载站点以显示消息
- php - laravel中的电子邮件不起作用