C/C++ 格式说明符及其用法

 更新时间:2025年05月22日 16:21:44   作者:暮色尽染  
在 C/C++ 中,格式说明符(Format Specifiers)主要用于 printf()、scanf() 等输入输出函数中,用于控制数据的格式化输入和输出,下面给大家介绍C/C++ 格式说明符及其用法,感兴趣的朋友一起看看吧

在 C/C++ 中,格式说明符(Format Specifiers)主要用于 printf()scanf() 等输入输出函数中,用于控制数据的格式化输入和输出。以下是常见的格式说明符及其用法:

一、基础格式说明符

说明符适用数据类型描述
%dint十进制整数(带符号)
%uunsigned int十进制无符号整数
%ffloat浮点数(默认保留6位小数)
%lfdouble双精度浮点数(printf中可用%f代替,但scanf必须用%lf
%cchar单个字符
%schar* (C 字符串)字符串(需以 \0 结尾)
%pvoid*指针地址(十六进制格式,如 0x7ffeeb0b4d60
%xint, unsigned int十六进制整数(小写字母,如 1a3f
%X同上十六进制整数(大写字母,如 1A3F
%o同上八进制整数
%efloat, double科学计数法(小写 e,如 3.141593e+00
%E同上科学计数法(大写 E,如 3.141593E+00
%g/%G同上自动选择 %f%e(根据数值大小决定更紧凑的格式)
%%-输出百分号 %

二、修饰符(用于精细控制格式)

1. 宽度与对齐

printf("%10d", 123);   // 输出宽度为10,右对齐:"       123"
printf("%-10d", 123);  // 输出宽度为10,左对齐:"123       "

2. 精度控制

printf("%.2f", 3.14159); // 保留2位小数:3.14
printf("%.5s", "hello world"); // 截取前5个字符:"hello"

3. 填充字符

printf("%05d", 42);    // 用0填充宽度5:"00042"

4. 长度修饰符

修饰符示例描述
h%hd, %hushort int / unsigned short
l%ld, %lulong int / unsigned long
ll%lld, %llulong long int / unsigned long long
L%Lf, %Lelong double

三、scanf() 的格式说明符

scanf() 中必须严格匹配数据类型:

int num;
scanf("%d", &num);  // 输入整数
double value;
scanf("%lf", &value); // 输入双精度浮点数(必须用%lf)

跳过输入

scanf("%d %*s %f", &age, &salary); // 跳过中间的字符串输入

四、代码示例

#include <stdio.h>
int main() {
    int num = 42;
    float pi = 3.14159;
    char str[] = "Hello";
    printf("十进制: %d, 十六进制: 0x%x\n", num, num);
    printf("浮点数: %.2f, 科学计数法: %e\n", pi, pi);
    printf("字符串: %s, 地址: %p\n", str, (void*)&num);
    printf("填充示例: %05d\n", num);
    return 0;
}

输出

十进制: 42, 十六进制: 0x2a
浮点数: 3.14, 科学计数法: 3.141590e+00
字符串: Hello, 地址: 0x7ffd5a3d4a4c
填充示例: 00042

五、注意事项

  • 类型匹配:格式说明符必须与变量类型严格匹配,否则可能导致未定义行为。
    • 错误示例:printf("%d", 3.14); // 错误!应用 %f
  • 指针与地址%p 需要将指针强制转换为 void*
  • 字符串安全scanf("%s", str) 可能导致缓冲区溢出,建议用 %Ns(如 %10s)限制输入长度。

到此这篇关于C/C++ 格式说明符的文章就介绍到这了,更多相关C++ 格式说明符内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入学习C语言mmap和shm*的使用方法技巧

    深入学习C语言mmap和shm*的使用方法技巧

    本文将详细介绍mmap和shm的工作原理,包括它们在内存映射和共享内存方面的优势和适用场景,同时,文章还会分享一些使用mmap和shm的技巧和经验,以帮助读者优化并提高程序性能,使你能够在实际项目中更好地利用这些技术来加速数据共享和多线程应用
    2023-10-10
  • Matlab实现绘制高阶版本韦恩图(upset图)

    Matlab实现绘制高阶版本韦恩图(upset图)

    韦恩图随着阶数升高会越来越复杂,当阶数达到7或者以上时几乎没办法绘制,但是使用upset图却可以比较轻易的绘制。本文就来用Matlab实现绘制upset图,需要的可以参考一下
    2023-01-01
  • C++实现修改函数代码HOOK的封装方法

    C++实现修改函数代码HOOK的封装方法

    这篇文章主要介绍了C++实现修改函数代码HOOK的封装方法,有助于深入了解C++的HOOK原理,需要的朋友可以参考下
    2014-10-10
  • C++中volatile关键字的使用详解以及常见的误解

    C++中volatile关键字的使用详解以及常见的误解

    volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统,硬件或者其他线程等
    2020-01-01
  • c++中将二维数组元素变换为逆向存放的实现代码

    c++中将二维数组元素变换为逆向存放的实现代码

    编程将一个二维数组元素变换为逆向存放,即按元素在内存中的物理排列位置,第一个元素变成倒数第一个元素,第二个元素变成倒数第二个元素,依此类推
    2020-11-11
  • QT使用Http协议通信的实现示例

    QT使用Http协议通信的实现示例

    使用QT进行应用开发时,有时候需要进行客户端和服务端的网络通信,本文主要介绍了QT使用Http协议通信的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • C++下程序运行时间的四种常用计时方法总结

    C++下程序运行时间的四种常用计时方法总结

    这篇文章主要介绍了C++下程序运行时间的四种常用计时方法,介绍了几种常用的计时方法,包括低精度的clock()和GetTickCount(),以及高精度的gettimeofday()和QueryPerformanceCounter(),需要的朋友可以参考下
    2024-09-09
  • VS+QT编译环境中字符乱码问题解决方法

    VS+QT编译环境中字符乱码问题解决方法

    编码就是把⼀个字符编码成二进制码存起来的方式,而解码就是把这个二进制码按照原本编码的规则还原成原来的字符,这篇文章主要介绍了VS+QT编译环境中字符乱码问题详解,需要的朋友可以参考下
    2024-01-01
  • C++实现选择排序(selectionSort)

    C++实现选择排序(selectionSort)

    这篇文章主要为大家详细介绍了C++实现选择排序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • 初学C++之自定义类型名简化详解

    初学C++之自定义类型名简化详解

    下面小编就为就大家带来一篇初学C++之自定义类型名简化详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09

最新评论