C语言的格式化输出 printf
最近在看一些新手写的代码发现大家在最基本的printf上经常出状况。这玩意虽然是入门第一课就会见到的函数但它的参数设计其实挺别扭的。今天把printf的使用细节和几个极其容易让人抓狂的坑顺一遍。怎么理解这玩意在 C 语言里我们想在控制台看数据基本上全靠printf。那个字母f代表 formatted格式化。因为 C 语言没有其他高级语言那种用加号拼接字符串的便利设计我们要输出稍微复杂点的内容就得用它来“拼图”。它的调用方式是这样的printf(一个带占位符的模板, 变量列表);简单来说你先在双引号里写好你要输出的格式在需要填入数据的地方放一个百分号%开头的字符占位符占个坑然后在双引号后面按顺序把变量传进去填坑。初学时别去背那些密密麻麻的格式表记住这四个最常用的就足够了%d对应整数int。%f对应小数float或double。如果不加控制它默认会输出六位小数。通常我们会写成%.2f保留两位小数或%.1f保留一位。%c对应单个字符char。%s对应字符串也就是一串字符。另外双引号里还可以放排版控制符比如\n代表换行\t代表水平制表符相当于按了一下 Tab 键。要是漏了\n控制台打印出来的字就会全部黏在一起看起来非常业余。上代码看看我们用一个买奶茶的账单例子来看看怎么格式化输出#include stdio.h int main() { int cups 2; // 买了2杯 double price 16.5; // 单价16.5元 char size L; // 大杯 // 打印标题行用 \t 控制间距对齐 printf(品名\t数量\t单价\t规格\n); // 填坑打印数据注意顺序要和占位符严格一致 printf(奶茶\t%d\t%.1f\t%c\n, cups, price, size); printf(账单状态%s\n, 已结算); return 0; }代码逐行拆解printf(品名\t数量\t单价\t规格\n); 打印完每个词后插入\t大厨系统会自动空出合适的空格这样下一行的数据就能跟它对齐。printf(奶茶\t%d\t%.1f\t%c\n, cups, price, size); 这一行挖了三个坑。后面的cups填入%dprice填入%.1fsize填入%c。顺序要是错了输出结果就会完全乱套。两个容易卡住的坑新手用printf十个有九个会卡在下面这两个问题上踩坑注意类型匹配写错或者在变量名前面误加了取地址符。错误代码示范#include stdio.h int main() { int num 100; double val 12.34; // 错误 1打印变量时加了 符号 printf(数值是%d\n, num); // 错误 2用 %d 占位符去打印 double 类型的小数 printf(小数是%d\n, val); return 0; }怎么修正对于第一个错误printf只需要拿到num盒子里装的值100但你加了传过去的就变成了num在内存里的物理地址。结果屏幕上会打印出一长串莫名其妙的超级大数字。修正方法是直接写num不要加。对于第二个错误val是 8 字节的 double 小数但你却用只读取 4 字节的%d去解析它。由于内存读取宽度对不上计算机解析出来的值通常会直接显示为0或者其他垃圾数值。修正方法是把%d改为%f或%.2f。留个小练习动手写几行代码测试一下。挑战题目 编写一个 C 程序声明并初始化三个变量品名字符串如 可乐、数量整型如 3、价格浮点型如 3.5。只使用一个printf语句在控制台屏幕上输出以下三行信息且确保数据在纵向排列上完全对齐品名 数量 价格 可乐 3 3.50 薯片 1 7.50参考答案与思路我们可以把所有文字和数据合并在一个printf语句里中间利用\t控制缩进行尾用\n控制换行。因为浮点数默认输出 6 位小数所以价格占位符要用%.2f。#include stdio.h int main() { // 单个 printf 打印三行规整表格 printf(品名\t数量\t价格\n可乐\t%d\t%.2f\n薯片\t%d\t%.2f\n, 3, 3.50, 1, 7.50); return 0; }跑一下代码看看输出的表格是不是非常规整。