printf(s) 与 printf("%s",s) 区别

printf(s);       //危险
printf("%s",s);


如果 s 字符串中包含像 %s 之类的格式控制字符

第1个式子的程序会崩溃

第2个式子没有这个问题

<think>我们正在讨论C语言中printf函数的格式化输出符号%d和%s。 根据引用[1]:%d用于输出整数(十进制),%c用于输出字符,%p用于输出指针,%x用于输出十六进制整数。 引用[2]提到:%.*s用于控制字符串输出长度,其中*表示一个变量,用于指定最大输出字符数。 引用[3]强调:格式化字符串必须传入参数类型匹配,否则会导致未定义行为。 因此,我们将详细解释%d和%s的用法和注意事项。</think>### C语言中 `printf` 函数的格式化输出符号详解 #### 1. **`%d` - 十进制整数输出** ```c int age = 25; printf("年龄: %d", age); // 输出: 年龄: 25 ``` - **功能**:将整数以十进制格式输出 - **特点**: - 支持所有整数类型(`int`, `short`, `long`) - 自动处理负数(`-5` → `-5`) - 格式控制示例: ```c int num = 42; printf("默认: %d\n", num); // 42 printf("宽度5: %5d\n", num); // " 42" printf("补零: %05d\n", num); // "00042" printf("左对齐: %-5d!\n", num); // "42 !" ``` #### 2. **`%s` - 字符串输出** ```c char name[] = "Alice"; printf("姓名: %s", name); // 输出: 姓名: Alice ``` - **功能**:输出以空字符(`\0`)结尾的字符数组 - **关键特性**: - 必须指向有效的内存地址 - 遇到 `\0` 自动终止 - 格式控制示例: ```c char text[] = "Hello"; printf("|%s|\n", text); // |Hello| printf("|%10s|\n", text); // | Hello| printf("|%-10s|\n", text); // |Hello | ``` #### 3. **高级用法:`%.*s`(动态长度控制)[^2]** ```c char str[] = "ABCDEFG"; int max_len = 3; printf("截断输出: %.*s", max_len, str); // 输出: ABC ``` - **原理**:通过参数动态控制输出长度 - **应用场景**: - 防止缓冲区溢出 - 处理非空终止字符串 - 分页显示长文本 #### 4. **类型匹配的重要性[^3]** 不匹配的格式化符号会导致未定义行为: ```c // 错误示例 float pi = 3.14; printf("错误输出: %d", pi); // 可能输出乱码或崩溃 // 正确匹配 printf("浮点数: %.2f", pi); // 3.14 ``` **类型匹配表**: | 数据类型 | 正确格式符 | 错误格式符 | |---------------|------------|------------| | `int` | `%d` | `%f`, `%s` | | `float` | `%f` | `%d`, `%s` | | `char[]` | `%s` | `%d`, `%f` | | `long` | `%ld` | `%d` | | `double` | `%lf` | `%f` | #### 5. **完整格式说明符结构** ```c %[标志][宽度][.精度][长度]类型 ``` - **示例解析**: `%'-10.3ld` 表示: - `'`:千位分隔符 - `-`:左对齐 - `10`:最小宽度10字符 - `.3`:显示至少3位数字 - `l`:`long` 类型 - `d`:十进制整数 #### 6. **实用技巧** 1. **打印内存地址**: ```c int var; printf("变量地址: %p", &var); // 输出类似 0x7ffd42a1c ``` 2. **多参数输出**: ```c printf("%d天有%d小时", 7, 7*24); // 7天有168小时 ``` 3. **格式复用**: ```c printf("折扣: %d%% OFF", 20); // 输出: 折扣: 20% OFF ``` > **警告**:永远不要将用户输入直接作为格式字符串! > ```c > // 高危操作 > char user_input[100]; > gets(user_input); // 用户输入"%n"会触发漏洞 > printf(user_input); // 可能导致内存泄漏 > ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值