← 返回 C++ 学习记录

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,具体区别见输入输出记录。

返回全部学习记录 ↗