关于printf输出格式类型的总结

本文详细介绍了C语言中的printf函数,包括其基本语法、格式控制字符串的使用方法,以及如何指定输出数据的类型、形式、长度和小数位数等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、函数调用形式
printf函数调用的一般形式为:
printf(“格式控制字符串”, 输出表列)
其中格式控制字符串用于指定输出格式。格式控制串可由格式字符串和非格式字符串两种组成。格式字符串是以%开头的字符串,在%后面跟有各种格式字符,以说明输出数据的类型、形式、长度、小数位数等。如:
“%d”表示按十进制整型输出;
“%ld”表示按十进制长整型输出;
“%c”表示按字符型输出等。
非格式字符串原样输出,在显示中起提示作用。输出表列中给出了各个输出项,要求格式字符串和各输出项在数量和类型上应该一一对应。
格式字符串
函数原型在头文件“cstdio”中
二、在Turbo C中格式字符串的一般形式为:
[标志][输出最小宽度][.精度][长度]类型。
其中方括号[]中的项为可选项。

各项的意义介绍如下。

1) 类型
类型字符用以表示输出数据的类型,其格式符和意义如下表所示:
格式字符 意义
d 以十进制形式输出带符号整数(正数不输出符号)
o 以八进制形式输出无符号整数(不输出前缀0)
x,X 以十六进制形式输出无符号整数(不输出前缀Ox)
u 以十进制形式输出无符号整数
f 以小数形式输出单、双精度实数
e,E 以指数形式输出单、双精度实数
g,G 以%f或%e中较短的输出宽度输出单、双精度实数
c 输出单个字符
s 输出字符串

2) 标志
标志字符为 -、+、# 和空格四种,其意义下表所示:
标 志 意义
- 结果左对齐,右边填空格
+ 输出符号(正号或负号)
空格 输出值为正时冠以空格,为负时冠以负号
#
对下述的作用:
{
对c,s,d,u类无影响;
对o类,在输出时加前缀o;
对x类,在输出时加前缀0x;
对e、g、f 类当结果有小数时才给出小数点。
}
3) 输出最小宽度
用十进制整数来表示输出的最少位数。若实际位数多于定义的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或0。

4) 精度
精度格式符以“.”开头,后跟十进制整数。本项的意义是:如果输出数字,则表示小数的位数;如果输出的是字符,则表示输出字符的个数;若实际位数大于所定义的精度数,则截去超过的部分。

三、各进制数常量的输出
八进制整型常量:由正、负号 和 0至7的数码组成,并且第一个数码必须是0
十进制整型常量:由正、负号 和 0至9的数码组成,并且第一个数码不能是0
十六进制整型常量:由正、负号 和 数码0至9、a至f或A至F组成,并且要有前缀0x

四、举例说明
1、

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int a=502,b=024;//b为八进制数,输出时转化为十进制数输出
printf("%2d,%2d\n",a,b);//输出的变量列宽为2。如果这里的列宽值大于实际变量列宽,输出时就会自动补全,即以实际为准。如果列宽值大于实际,就左端补空格。%2d右对齐,左边补空格,%-2d左对齐,右边补空格;
}

输出为:
502,20

2、
printf(“%-6.3f\n”,a);
其中,“-”号还是表示左对齐,6表示提供6个字符空间用于输出,小数点后面的3表示小数部分输出3位,如:
(1) a=1.3125时,输出:1.312_
(2) a=1.2时,输出:1.200_
(3) a=1.12时,输出:1.120_
(4) a=10.123时,输出:10.123
(5) a=100.125时,输出:100.125
说明:
如果小数部分超过3位,则会缩减到3位,如(1);
如果小数部分低于3位,则会补充0到3位,如(2)和(3) ;
如果小数部分通过缩减或补充之后a的位数还是超过了6位,则还是直接输出了,如(5)。
从上面还可以看出,小数点是占用1位的,而小数部分则肯定占用3位,剩下2位由整数部分占用;整数部分是不会被缩减的,如(5)。

3、

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
int a=502,b=024;
char str1[]="hel";
char str2[]="hello,world";
printf("%2d,%2d\n",a,b);
printf("%5.9s\n",str1);//输出最少5个字符串,最多9个字符串,右对齐
printf("%5.9s\n",str2);
system("pause");
return 0;
}

这里写图片描述

### C语言 `printf` 输出类型与 `char**` 的使用方法 #### 1. `printf` 函数的输出类型 `printf` 是标准库 `<stdio.h>` 中的一个函数,用于格式输出。常见的占位符及其用途如下表所示: | 占位符 | 描述 | |--------|--------------------------| | `%d` | 整数(十进制) | | `%f` | 浮点数 | | `%c` | 字符 | | `%s` | 字符串 | | `%p` | 指针地址 | 当涉及到指针类型时,尤其是 `char*` 和 `char**`,需要特别注意其行为。 --- #### 2. `char*` 和 `char**` 的基础概念 - **`char*`**: 表示指向单个字符或字符串的指针。 - **`char**`**: 表示指向 `char*` 类型的指针,通常用于表示字符串数组或其他更复杂的结构。 --- #### 3. `printf` 处理 `char*` 和 `char**` ##### (1)`char*` 的处理 假设存在以下代码片段: ```c char *p = "hello"; printf("%s\n", p); // 正确,输出 "hello" printf("%c\n", *p); // 正确,输出 'h' printf("%d\n", p); // 输出指针地址(整数值) printf("%d\n", *p); // 输出第一个字符的 ASCII 值 ('h' -> 104) ``` 解释: - 当使用 `%s` 格式说明符时,`printf` 需要一个 `char*` 参数,它会从该地址开始读取字符,直到遇到 `\0` 终止符为止[^1]。 - 使用 `%c` 时,`*p` 解引用后返回的是第一个字符 `'h'`。 - 使用 `%d` 时,`p` 返回的是指针本身的地址值,而 `*p` 返回的是所指向的第一个字符的 ASCII 值。 ##### (2)`char**` 的处理 考虑以下代码片段: ```c char *arr[] = {"one", "two", "three"}; char **ptr = arr; printf("%s\n", ptr[0]); // 正确,输出 "one" printf("%s\n", *(ptr + 1)); // 正确,输出 "two" printf("%p\n", ptr); // 输出指针地址 printf("%p\n", *ptr); // 输出第一个字符串的起始地址 ``` 解释: - `ptr` 是一个指向 `char*` 的指针,因此可以通过索引 `[ ]` 或偏移 `( )` 来访问具体的字符串。 - 使用 `%s` 时,`ptr[0]` 或 `*(ptr + 1)` 提供了有效的字符串地址。 - 使用 `%p` 时,`ptr` 返回的是自身的地址,而 `*ptr` 返回的是第一个字符串 `"one"` 的首地址[^2]。 --- #### 4. 动态分配内存与 `char**` 动态分配内存是高级用法之一,尤其适用于无法预先知道字符串数量的情况。例如: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int count = 3; char **strings = (char **)malloc(count * sizeof(char *)); strings[0] = strdup("apple"); strings[1] = strdup("banana"); strings[2] = strdup("cherry"); for (int i = 0; i < count; ++i) { printf("%s\n", strings[i]); } for (int i = 0; i < count; ++i) { free(strings[i]); // 释放每个字符串占用的空间 } free(strings); // 释放指针数组本身 return 0; } ``` 解释: - `malloc` 分配了一个能够存储 `count` 个 `char*` 地址的空间。 - 每个字符串都通过 `strdup` 创建独立的拷贝,并存放在 `strings` 数组中。 - 最终需逐级释放资源以防止内存泄漏。 --- #### 5. 特殊情况:错误用法 某些情况下可能会引发未定义行为,例如: ```c char *p = "hello"; // 错误:试图修改只读字符串常量 *p = 'H'; char p_arr[6] = "world"; // 正确:可以修改堆栈上的局部数组 p_arr[0] = 'W'; ``` 原因在于,字符串字面量通常是存储在只读区域中的,任何尝试修改的行为都会导致崩溃或异常[^3]。 --- ### 总结 通过对 `printf` 的不同格式说明符以及 `char*` 和 `char**` 的深入探讨可知,正确理解和运用这些基础知识对于编写高效、安全的 C 程序至关重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值