Bootstrap

C语言菜鸟入门·printf格式化打印总结(%d、%i、%hd、%zd、%u、%lu、%o、%x、%f、%E、%g、%c、%s等)

目录

1.  整数

1.1  十进制

1.1.1  %d

1.1.2  %i

1.1.3  %hd

1.1.4  %ld

1.1.5  %lld 

1.1.6  %zd

1.1.7  %u

1.1.8  %llu

1.1.9  %lu

1.1.10  总结

1.2  八进制(%o、%ho、%lo、%llo)

1.3  十六进制(%x、%hx、%lx、%llx)

2.  浮点数

2.1  %f

2.2  %lf

2.3  %Lf

2.4  %e

2.5  %E

2.6  %Le

2.7  %g

2.8  %G

2.9  %a

2.10  %A

2.11 总结

3.  字符

3.1  %c

3.2  %s

4.  特殊打印格式

5.  全章总结


1.  整数

1.1  十进制

1.1.1  %d

输出整数:

#include <stdio.h>

int main() {
    int a = 42;
    printf("%d\n", a);  // 输出:42
    return 0;
}

输出负数:

#include <stdio.h>

int main() {
    int a = -123;
    printf("%d\n", a);  // 输出:-123
    return 0;
}

输出0:

#include <stdio.h>

int main() {
    int a = 0;
    printf("%d\n", a);  // 输出:0
    return 0;
}

1.1.2  %i

        在 C 语言中,%i 和 %d 都用于打印 有符号十进制整数,它们几乎是等效的。

#include <stdio.h>

int main() {
    int a = 42;
    printf("%i\n", a);  // 输出:42
    printf("%d\n", a);  // 输出:42
    return 0;
}

两者的主要区别在于:

  • %d 是标准的十进制格式化说明符,用于打印整数。
  • %i 也是用于打印整数,特别是在输入时,它能根据输入的数值的前缀(例如 0x 或 0)来决定数字的进制类型。对于打印整数时,%i 和 %d 在输出结果上没有差别。
     
#include <stdio.h>

int main() {
    int a;
    printf("请输入一个整数:");
    scanf("%i", &a);  // 如果输入以 0x 开头,认为是十六进制;以 0 开头,认为是八进制
    printf("你输入的整数是:%d\n", a);
    return 0;
}

输入十进制:

输入八进制:

输入十六进制:

1.1.3  %hd

        在 C 语言中,%hd 是用于打印 短整型(short) 整数的格式说明符。它指定输出的是一个 short int 类型的变量,这种类型的变量通常占用 2 个字节(16 位),但大小依赖于编译器和平台。

输出 short 类型变量:

#include <stdio.h>

int main() {
    short a = 42;
    printf("%hd\n", a);  // 输出:42
    return 0;
}

输出负数的 short 类型变量:

#include <stdio.h>

int main() {
    short a = -123;
    printf("%hd\n", a);  // 输出:-123
    return 0;
}

错误的类型:

#include <stdio.h>

int main() {
    int a = 32768;
    printf("%hd\n", a);  // 错误:a 是 int 类型,不是 short
    return 0;
}

        会造成溢出: 

C语言菜鸟入门·关键字·修饰关键字short、long、signed、unsigne详细-CSDN博客

1.1.4  %ld

        在 C 语言中,%ld 是用于打印 长整型(long) 整数的格式说明符。它指定输出的是一个 long int 类型的变量,通常用于存储较大的整数值。

输出 long 类型变量:

#include <stdio.h>

int main() {
    long a = 1234567890L;  // L 表示 long 常量
    printf("%ld\n", a);  // 输出:1234567890
    return 0;
}

输出负值的 long 类型变量:

#include <stdio.h>

int main() {
    long a = -1230L;  // 负值的 long 类型
    printf("%ld\n", a);  // 输出:-1230
    return 0;
}

1.1.5  %lld 

        在 C 语言中,%lld 是用于打印 长长整型(long long) 整数的格式说明符。它指定输出的是一个 long long int 类型的变量,通常用于存储比 long 类型更大的整数值。

#include <stdio.h>

int main() {
    long long a = 1234567890123456789LL;  // LL 表示 long long 常量
    printf("%lld\n", a);  // 输出:1234567890123456789
    return 0;
}

        也能输出负值这里就不在做过多演示了。

1.1.6  %zd

        在 C 语言中,%zd 是一个格式说明符,用于输出 size_t 类型 的变量。size_t 是一个无符号整数类型,通常用于表示对象的大小或数组的索引,它的大小依赖于平台(通常在 64 位平台上为 8 字节,在 32 位平台上为 4 字节)。

#include <stdio.h>
#include <stddef.h>  // 包含 size_t 类型定义

int main() {
    size_t size = sizeof(int);  // 获取 int 类型的大小
    printf("Size of int: %zu\n", size);  // 使用 %zu 输出 size_t 类型变量
    return 0;
}

输出数组的大小:

#include <stdio.h>

int main() {
    int arr[10];
    size_t size = sizeof(arr) / sizeof(arr[0]);  // 计算数组元素个数
    printf("Number of elements in arr: %zu\n", size);  // 输出数组元素个数
    return 0;
}

size_t 在指针运算中的应用:

#include <stdio.h>

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    size_t index = 3;
    printf("Element at index %zu is: %d\n", index, arr[index]);  // 输出索引位置元素的值
    return 0;
}

1.1.7  %u

        在 C 语言中,%u 是一个格式说明符,用于输出 unsigned int 类型的变量。具体来说,它表示输出一个无符号的整数值。

#include <stdio.h>

int main() {
    unsigned int num = 4294967295;  // 假设在32位系统下,无符号整型的最大值
    printf("The number is: %u\n", num);  // 使用 %u 输出无符号整数
    return 0;
}

        无符号整数只能表示零或正数,不能表示负数。如果变量是负数而用 %u 格式化输出,它会解释为一个很大的正整数,等于其补码表示的值。负数使用 %u 输出:

#include <stdio.h>

int main() {
    int num = -5;
    printf("num = %u\n", num);  // 错误的输出:会解释为一个非常大的无符号整数
    return 0;
}

        因为 num 是一个 int 类型,而 %u 是为 unsigned int 设计的。-5 的补码表示被解释为一个非常大的无符号整数值(对于 32 位系统,-5 在补码下等于 4294967291)。

1.1.8  %llu

        在 C 语言中,%llu 是一个格式说明符,用于输出 unsigned long long 类型的变量。unsigned long long 是一种无符号的整数类型,通常用于表示更大的数值范围。

#include <stdio.h>

int main() {
    unsigned long long num = 18446744073709551615U;  // 无符号长长整数的最大值
    printf("The number is: %llu\n", num);  // 使用 %llu 输出无符号长长整数
    return 0;
}

        输出负数的原理和 %u 是一样的,可以自己操作一下。

1.1.9  %lu

        在 C 语言中,%lu 是一个格式说明符,用于输出 unsigned long 类型的变量。

#include <stdio.h>

int main() {
    unsigned long num = 4294967295UL;  // 无符号长整数,最大值(32 位系统)
    printf("The number is: %lu\n", num);  // 使用 %lu 输出无符号长整型
    return 0;
}

        输出负数的原理和 %u 也是一样的。

1.1.10  总结

占位符 含义
%dint 、char(输出ASCII值)
%i用于打印有符号十进制整数,根据输入的数值的前缀(例如 0x 或 0)来决定数字的进制类型
%hdshort
%ldlong int 
%lldlong long int 
%zdsize_t 
%uunsigned int
%lluunsigned long long int
%luunsigned long int

1.2  八进制(%o、%ho、%lo、%llo)

        通过上面总结我们也可以大概看出来一个 l 代表 long,两个 l 代表 long long,h代表short。八进制可以整理为:

占位符含义
%o以八进制格式输出 int
%ho以八进制格式输出 short int
%lo以八进制格式输出 long int 
%llo八进制格式输出  long long int 
#include <stdio.h>

int main() {
    int a = 123;
    short b = 12345;
    long c = 1234567;
    long long d = 123456789; 
    
    printf("a in octal: %o\n", a);   // 输出 int 类型变量 a 的八进制
    printf("b in octal: %ho\n", b);  // 输出 short 类型变量 b 的八进制
    printf("c in octal: %lo\n", c);  // 输出 long 类型变量 c 的八进制
    printf("d in octal: %llo\n", d); // 输出 long long 类型变量 d 的八进制
    
    return 0;
}

        输出的八进制数字不带前缀 0。如果你希望显示 0 前缀,可以使用 # 标志,例如:%#o。

#include <stdio.h>

int main() {
    int a = 123;
    short b = 12345;
    long c = 1234567;
    long long d = 123456789; 
    
    printf("a in octal: %#o\n", a);   // 输出 int 类型变量 a 的八进制
    printf("b in octal: %#ho\n", b);  // 输出 short 类型变量 b 的八进制
    printf("c in octal: %#lo\n", c);  // 输出 long 类型变量 c 的八进制
    printf("d in octal: %#llo\n", d); // 输出 long long 类型变量 d 的八进制
    
    return 0;
}

1.3  十六进制(%x、%hx、%lx、%llx)

        同样的十六进制的表述可以写为:

占位符含义
%x写字母表示十六进制输出 int 类型数据。
%hx写字母表示十六进制输出 short int 类型数据。
%lx写字母表示十六进制输出 long int 类型数据。
%llx写字母表示十六进制输出 long long int 类型数据。
%X写字母表示十六进制输出 int 类型数据。
%hX写字母表示十六进制输出 short int 类型数据。
%lX写字母表示十六进制输出 long int 类型数据。
%llX写字母表示十六进制输出 long long int 类型数据。

小写字母显示: 

#include <stdio.h>

int main() {
    int a = 1234;
    short b = 1234;
    long c = 123456789;
    long long d = 123456789012345;

    printf("a in hexadecimal: %x\n", a);   // 输出 int 类型 a 的十六进制
    printf("b in hexadecimal: %hx\n", b);  // 输出 short 类型 b 的十六进制
    printf("c in hexadecimal: %lx\n", c);  // 输出 long 类型 c 的十六进制
    printf("d in hexadecimal: %llx\n", d); // 输出 long long 类型 d 的十六进制
    
    return 0;
}

大写字母显示:

#include <stdio.h>

int main() {
    int a = 1234;
    short b = 1234;
    long c = 123456789;
    long long d = 123456789012345;

    printf("a in hexadecimal: %X\n", a);   // 输出 int 类型 a 的十六进制
    printf("b in hexadecimal: %hX\n", b);  // 输出 short 类型 b 的十六进制
    printf("c in hexadecimal: %lX\n", c);  // 输出 long 类型 c 的十六进制
    printf("d in hexadecimal: %llX\n", d); // 输出 long long 类型 d 的十六进制
    
    return 0;
}

增加前缀:

#include <stdio.h>

int main() {
    int a = 1234;
    short b = 1234;
    long c = 123456789;
    long long d = 123456789012345;

    printf("a in hexadecimal: %#x\n", a);   // 输出 int 类型 a 的十六进制
    printf("b in hexadecimal: %#hx\n", b);  // 输出 short 类型 b 的十六进制
    printf("c in hexadecimal: %#lX\n", c);  // 输出 long 类型 c 的十六进制
    printf("d in hexadecimal: %#llX\n", d); // 输出 long long 类型 d 的十六进制
    
    return 0;
}

根据X的大小写,前缀也区分大小写:

2.  浮点数

2.1  %f

        %f 会按浮点数的标准格式输出,通常保留六位小数。

#include <stdio.h>

int main() {
    float a = 3.14159;
    double b = 2.718281828459;
    
    printf("a as float: %f\n", a);   // 输出 float 类型 a
    printf("b as double: %f\n", b);  // 输出 double 类型 b (默认以 %f 输出 double)
    
    return 0;
}

        可以通过在 %f 中指定精度来控制输出的小数位数。格式为:

%<宽度>.<精度>f

  • 宽度:输出的总宽度(包括整数部分、小数点和小数部分)。
  • 精度:小数点后面的位数
#include <stdio.h>

int main() {
    float a = 3.14159;
    double b = 2.718281828459;

    // 控制输出的小数位数
    printf("a with 2 decimal places: %.2f\n", a);   // 保留两位小数
    printf("b with 4 decimal places: %.4f\n", b);   // 保留四位小数
    
    return 0;
}

2.2  %lf

        在 C 语言中,%lf 是一个格式说明符,用来输出 双精度浮点数(double 类型)。虽然在 C99 标准之前,%f 和 %lf 有不同的用途(%f 用于 float,%lf 用于 double),但从 C99 标准开始,%f 和 %lf 都可以用来打印 double 类型的数据。在现代的 C 语言编程中,%lf 和 %f 在 printf 中没有区别,它们都用于打印 double 类型的值。

#include <stdio.h>

int main() {
    double pi = 3.14159265358979323846;

    // 使用 %f 和 %lf 打印 double 类型
    printf("pi with %%f: %f\n", pi);  // 输出 double 类型 pi
    printf("pi with %%lf: %lf\n", pi); // 输出 double 类型 pi

    return 0;
}

2.3  %Lf

        在 C 语言中,%Lf 用于输出 扩展精度浮点数(long double 类型)。与 float 和 double 类型相比,long double 类型提供更高的精度和更大的数值范围,适用于需要更高精度浮点运算的情况。

#include <stdio.h>

int main() {
    long double pi = 3.141592653589793238462643383279502884197169399375105820974944L;

    // 使用 %Lf 打印 long double 类型
    printf("pi with %%Lf: %Lf\n", pi);

    return 0;
}

2.4  %e

        在 C 语言中,%e 是一种格式说明符,用于以 科学计数法(也叫指数表示法)打印浮点数。科学计数法将数字表示为一个基数与 10 的幂的乘积,例如 1.23e+04 表示 1.23 × 10^4,即 12300。

        使用 %e 打印浮点数时,C 语言会自动将数字转换为科学计数法的形式,通常保留六位小数(默认情况下),并且指数部分会以 e 或 E 来表示。

#include <stdio.h>

int main() {
    double num1 = 12345.6789;
    double num2 = 0.000123456;

    // 使用 %e 打印浮点数,自动采用科学计数法表示
    printf("num1 in scientific notation: %e\n", num1);  // 输出:1.234568e+04
    printf("num2 in scientific notation: %e\n", num2);  // 输出:1.234560e-04

    return 0;
}

2.5  %E

        %E:%e 和 %E 的功能相同,唯一的区别是指数部分的大小写。%e 会使用小写字母 e,而 %E 会使用大写字母 E。

#include <stdio.h>

int main() {
    double num1 = 12345.6789;
    double num2 = 0.000123456;

    // 使用 %e 打印浮点数,自动采用科学计数法表示
    printf("num1 in scientific notation: %e\n", num1);  // 输出:1.234568e+04
    printf("num2 in scientific notation: %E\n", num2);  // 输出:1.234560e-04

    return 0;
}

2.6  %Le

        在 C 语言中,%Le 是一种格式说明符,用于打印 长双精度浮点数(long double)类型的值,且以 科学计数法(指数表示法)显示。这里的 L 表示该类型为 long double,e 表示以科学计数法输出。

#include <stdio.h>

int main() {
    long double num1 = 123456.7890123456789;
    long double num2 = 0.000000123456789;

    // 使用 %Le 打印 long double 类型的浮点数,采用科学计数法表示
    printf("num1 in scientific notation: %Le\n", num1);  // 输出:1.234568e+05
    printf("num2 in scientific notation: %Le\n", num2);  // 输出:1.234568e-07

    return 0;
}

2.7  %g

        在 C 语言中,%g 是一个格式说明符,用于输出浮点数,并且根据数值的大小自动选择最佳的表示方式,通常是 科学计数法 或 普通浮点格式。它根据值的大小来决定是以科学计数法(%e)还是以定点格式(%f)来输出浮动数。

%g 格式说明符的特点:

① 自动选择格式:%g 会根据数值的大小自动选择是使用科学计数法还是定点格式:

  •         如果数字的绝对值较大或较小,通常会采用 科学计数法(%e)。
  •         对于较为普通的数字,通常采用 定点表示法(%f)。

② 去除多余的零:如果数字的尾部有多余的零(例如 1.230000),%g 会去掉这些零,只保留有效数字。

③ 最大有效位数:默认情况下,%g 会打印6位有效数字,但可以通过指定精度来调整。例如,%.3g 会打印3位有效数字。

④ 指数表示法中的精度:当数字使用科学计数法输出时,%g 会保证输出适当的有效位数。

#include <stdio.h>

int main() {
    double num1 = 123456.789012;
    double num2 = 0.00000123456;
    double num3 = 123.456;

    // 使用 %g 来自动选择最佳的输出格式
    printf("num1 = %g\n", num1);  // 输出:123457
    printf("num2 = %g\n", num2);  // 输出:1.23456e-06
    printf("num3 = %g\n", num3);  // 输出:123.456

    return 0;
}

2.8  %G

        等同于 %g ,唯⼀的区别是指数部分的 E 为⼤写。

2.9  %a

        在 C 语言中,%a 是一个格式说明符,用于输出浮点数的 十六进制科学计数法 表示形式。它适用于 float 或 double 类型,能够以十六进制形式显示浮动数的值。

%a 的特点:

  •     十六进制表示法:%a 会将浮点数转换为十六进制格式,并使用科学计数法的形式显示。例如,1.5 会被表示为 0x1.8p+0。
  •     p符号:%a 输出结果中的 p 表示指数部分,这个指数是以 2 为底的指数(而不是 10),这就是为什么它被称为“二进制科学计数法”。
  •     格式:输出的结果通常是 0x 前缀,后跟一个十六进制的小数部分,最后是以二进制为基础的指数。
     

语法:

%a   // 默认精度,输出十六进制形式
%.nf // n 为精度,表示小数部分的位数

#include <stdio.h>

int main() {
    double num1 = 1.5;
    double num2 = 3.14;
    double num3 = 0.1;

    // 使用 %a 输出十六进制形式
    printf("num1 = %a\n", num1);  // 输出:num1 = 0x1.8p+0
    printf("num2 = %a\n", num2);  // 输出:num2 = 0x1.91eb86p+1
    printf("num3 = %a\n", num3);  // 输出:num3 = 0x1.99999ap-4

    return 0;
}

2.10  %A

        同%a,只不过改为大写。

2.11 总结

占位符含义
%ffloat
%lfdouble
%Lflong double 
%e使⽤科学计数法的浮点数,指数部分的 e 为⼩写
%E使⽤科学计数法的浮点数,指数部分的 E 为⼤写
%Le科学计数法表⽰ long double 
%g6个有效数字的浮点数;
整数部分⼀旦超过6位,就会⾃动转为科学计数法,指数部分的 e为⼩写
%G等同于 %g ,唯⼀的区别是指数部分的 E 为⼤写
%a⼗六进制浮点数,字⺟输出为⼩写
%A⼗六进制浮点数,字⺟输出为⼤写

3.  字符

占位符含义
%cchar
%s字符串

3.1  %c

        在 C 语言中,%c 是一个格式说明符,用于输出单个 字符 类型的数据。它会将对应的字符值作为字符打印出来,适用于 char 类型的变量。

#include <stdio.h>

int main() {
    char letter = 'A';
    char symbol = '#';

    printf("The letter is: %c\n", letter);  // 输出:The letter is: A
    printf("The symbol is: %c\n", symbol);  // 输出:The symbol is: #

    return 0;
}

3.2  %s

        在 C 语言中,%s 是一个格式说明符,用于输出 字符串 类型的数据。它会将一个以 null 字符('\0') 结尾的字符数组(即 C 风格字符串)打印出来。

#include <stdio.h>

int main() {
    char str[] = "Hello, World!";

    // 输出字符串
    printf("The string is: %s\n", str);  // 输出:The string is: Hello, World!

    return 0;
}

使用 printf 输出多个字符串:

#include <stdio.h>

int main() {
    char name[] = "Alice";
    char greeting[] = "Good Morning!";

    printf("%s, %s\n", greeting, name);  // 输出:Good Morning!, Alice

    return 0;
}

%s 的使用技巧:

字符串长度限制:%s 输出的字符串长度是有限制的(根据实际的字符串内容)。如果给定一个过长的字符串,printf 会从字符串的开头打印直到遇到 \0,不会发生缓冲区溢出,但如果字符串本身没有 \0,程序会继续打印直到找到一个 \0 为止,这可能会导致错误或不期望的行为。

格式化输出:你还可以使用宽度和精度修饰符来控制输出的格式。例如:

  •         %.n:限制输出的最大字符数。
  •         %m.n:指定输出的最小宽度和最大字符数。
     

4.  特殊打印格式

占位符含义
%%输出⼀个百分号
%p打印地址(一个十六进制的数)
%n已输出的字符串数量。
该占位符本⾝不输出,只将值存储在指定变量之中

5.  全章总结

占位符 含义
%dint 、char(输出ASCII值)
%i用于打印有符号十进制整数,根据输入的数值的前缀(例如 0x 或 0)来决定数字的进制类型
%hdshort
%ldlong int 
%lldlong long int 
%zdsize_t 
%uunsigned int
%lluunsigned long long int
%luunsigned long int
%o以八进制格式输出 int
%ho以八进制格式输出 short int
%lo以八进制格式输出 long int 
%llo八进制格式输出  long long int 
%x写字母表示十六进制输出 int 类型数据。
%hx写字母表示十六进制输出 short int 类型数据。
%lx写字母表示十六进制输出 long int 类型数据。
%llx写字母表示十六进制输出 long long int 类型数据。
%X写字母表示十六进制输出 int 类型数据。
%hX写字母表示十六进制输出 short int 类型数据。
%lX写字母表示十六进制输出 long int 类型数据。
%llX写字母表示十六进制输出 long long int 类型数据。
%ffloat
%lfdouble
%Lflong double 
%e使⽤科学计数法的浮点数,指数部分的 e 为⼩写
%E使⽤科学计数法的浮点数,指数部分的 E 为⼤写
%Le科学计数法表⽰ long double 
%g6个有效数字的浮点数;
整数部分⼀旦超过6位,就会⾃动转为科学计数法,指数部分的 e为⼩写
%G等同于 %g ,唯⼀的区别是指数部分的 E 为⼤写
%a⼗六进制浮点数,字⺟输出为⼩写
%A⼗六进制浮点数,字⺟输出为⼤写
%cchar
%s字符串
%%输出⼀个百分号
%p打印地址(一个十六进制的数)
%n已输出的字符串数量。
该占位符本⾝不输出,只将值存储在指定变量之中

关键字_时光の尘的博客-CSDN博客

C语言_时光の尘的博客-CSDN博客

;