C++ JOURNAL / C 语言补充
C 语言格式化输出补充
单独放下 printf 的练习,不与 cout 的规则混用。
按我的学习记录整理 · 示例用于帮助理解这篇记录里
这是 C 格式输出练习
长期学习主线仍然是 C++。这里单独整理曾经练习过的 printf 格式,不把它们当作 cout 的写法。
%d:int 的有符号十进制输出。%u:unsigned int 的十进制输出。%o:unsigned int 的八进制输出。%x:unsigned int 的十六进制输出。- 在中间加入 15,如
%15d,表示最小字段宽度 15,默认右对齐,通常补空格;不会截断更长的输出。
多个占位符不能只给一个参数
我曾经写成 printf("%15d\n%15u\n%15o\n%15x", a),格式里有四个占位符,却只提供一个参数。
这不是“把 a 自动输出四次”,而是错误地缺少参数,会产生未定义行为,不能信任它偶然输出的数字。数量、顺序、类型都要对应。
#include <stdio.h>
int main(void) {
int a = 15;
unsigned int b = 15;
printf("%15d\n%15u\n%15o\n%15x\n", a, b, b, b);
return 0;
}
四行分别显示 15、15、17、f,每行前面补空格到指定宽度。%d 对应 int,另外三个这里对应 unsigned int。
两位小数的错误记录
错误写法:
printf("%lf.2\n", a + b);
这里 .2 被放在转换说明之后,会作为普通文字输出。常见正确写法是:
#include <stdio.h>
int main(void) {
double a = 0.1, b = 0.2;
printf("%.2f\n", a + b);
return 0;
}
输出 0.30。在 printf 中,double 常用 %f;现代 C 中这里的 %lf 也不是“保留两位”的含义。不要把它和 scanf 混用:scanf 读 double 用 %lf,读 float 用 %f。
C++ 中则写 cout << fixed << setprecision(2) << a + b;,并包含相关头文件。
%s 不是 string 类型
%s 是 C 格式说明符。C++ 的 string 是类型,不能仅因“都是字符串”就直接给 printf/scanf 的 %s 传入一个 string 对象。目前先用 C++ 的 cin/cout 处理 string,具体区别见输入输出记录。