C语言格式化字符串规则

在C语言中,格式化字符串用于printfscanffprintffscanfsprintfsscanf等函数,控制输入输出的格式。以下是格式化字符串的详细规则:

1. 基本结构

格式化字符串由以下部分组成:

%[标志][宽度][.精度][长度修饰符]类型说明符

2. 类型说明符(必需部分)

常用类型说明符:

说明符

输出格式

适用数据类型

%d

十进制整数

int

%i

整数(自动检测进制)

int

%u

无符号十进制整数

unsigned int

%o

八进制整数

int

%x

十六进制整数(小写)

int

%X

十六进制整数(大写)

int

%f

浮点数

float, double

%F

浮点数(大写)

float, double

%e

科学计数法(小写e)

float, double

%E

科学计数法(大写E)

float, double

%g

自动选择%f或%e

float, double

%G

自动选择%F或%E

float, double

%c

单个字符

char

%s

字符串

char*

%p

指针地址

void*

%a

十六进制浮点数

float, double

%n

已写入字符数

int*

%%

百分号字符

3. 标志(可选)

标志

说明

-

左对齐(默认右对齐)

+

在正数前显示加号

空格

在正数前显示空格(负数前仍显示减号)

#

特殊格式:
- 对于%o,添加前导0
- 对于%x/%X,添加前导0x/0X
- 对于%a/%A/%e/%E/%f/%F/%g/%G,强制包含小数点

0

用前导0填充数字(而非空格)

4. 宽度(可选)

指定最小字段宽度:

  • 数字:最小字符数
  • *:从参数列表中获取宽度值
printf("%5d\n", 10);    // 输出 "   10"
printf("%*d\n", 5, 10); // 同上

5. 精度(可选)

以点号(.)开头,后跟:

  • 数字:精度值
  • *:从参数列表中获取精度值

对不同类型的影响:

  • 整数:最小数字位数(不足补0)
  • 浮点数:小数位数
  • 字符串:最大字符数
printf("%.2f\n", 3.14159);       // 输出 "3.14"
printf("%.5s\n", "hello world"); // 输出 "hello"

6. 长度修饰符(可选)

指定参数的大小:

修饰符

说明

hh

char或unsigned char

h

short或unsigned short

l

long或unsigned long

ll

long long或unsigned long long

long x = 123456789;
printf("%ld\n", x);

7. 特殊用法

scanf系列的特殊格式:

格式

说明

%[abc]

只匹配a、b、c字符

%[^abc]

匹配除a、b、c外的字符

%[0-9]

只匹配数字字符

%*d

读取但不存储(跳过该输入项)

char str[20];
scanf("%[^\n]", str); // 读取一行(直到换行符)
printf("print str %s\n", str); // 打印输入

8. 实际应用示例

#include <stdio.h>

int main()
{
    int i = 123;
    float f = 3.14159;
    char c = 'A';
    char s[] = "Hello";

    // 基本输出
    printf("int: %d\n", i);
    printf("float: %.2f\n", f);
    printf("char: %c\n", c);
    printf("string: %s\n", s);

    // 格式化控制
    printf("hex: %#x\n", i);    // 0x7b
    printf("E-counting: %.2e\n", f); // 3.14e+00
    printf("8 width: %8d\n", i);   // "     123"

    // scanf示例
    int a, b;
    printf("input two integer:");
    scanf("%d %d", &a, &b);
    printf("sum is: %d\n", a + b);

    return 0;
}

注意事项

  1. 类型说明符必须与参数类型匹配,否则会导致未定义行为
  2. scanf中使用%s时要小心缓冲区溢出,建议指定最大宽度
  3. 浮点数精度问题可能导致舍入误差
  4. 在格式字符串中使用%%表示百分号
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值