1. 字符串格式化的基础概念
在编程中,字符串格式化就像是我们日常生活中的"填空游戏"。想象一下,你有一张贺卡模板,上面写着"亲爱的__,祝你__快乐!",你需要把具体的名字和节日填进去。在QT开发中,我们经常需要把变量值"填"到字符串模板里,这就是字符串格式化的本质。
C语言时代就有的printf家族函数,是最早的字符串格式化工具。printf直接将结果输出到控制台,相当于把填好的贺卡直接读出来;sprintf则是把填好的贺卡内容存到一个信封(字符数组)里。但这里有个隐患:如果信封太小,而贺卡内容太多,就会把信封撑破——这就是著名的缓冲区溢出问题。
2. printf与sprintf的详细对比
2.1 printf函数的使用与特点
printf是C语言标准库中的元老级函数,它的工作方式简单直接:
int age = 25;
printf("我今年%d岁", age); // 输出:我今年25岁
这个函数有几个关键特点:
- 直接输出到标准输出(通常是终端)
- 不需要考虑内存分配问题
- 格式字符串中使用%开头的占位符(如%d表示整数)
但在GUI程序中,我们往往需要把格式化结果保存下来而不是直接输出,这时就需要sprintf出场了。
2.2 sprintf的安全隐患与替代方案
sprintf的函数原型看起来很简单:
char buffer[50];
int count = sprintf(buffer, "有%d个苹果", 10);
但这里隐藏着一个定时炸弹:如果格式化后的字符串长度超过buffer的大小,就会发生缓冲区溢出。我在早期项目中就踩过这个坑,当时定义了一个20字节的buffer,结果当数字超过999时,程序直接崩溃了。
更安全的做法是使用snprintf:


4731

被折叠的 条评论
为什么被折叠?



