深入探索C语言格式化输出
立即解锁
发布时间: 2025-08-21 00:53:47 阅读量: 1 订阅数: 3 


C语言编程入门与实践
# 深入探索 C 语言格式化输出
## 1. 引言
在编程中,输入和输出是非常重要的部分。之前的输出往往以最简单的形式呈现到屏幕上,现在我们将深入探讨各种输入输出方式以及更复杂的格式化操作。
## 2. 格式化输出概述
C 语言的 `printf()` 函数提供了丰富的格式化选项,可对整数(有符号和无符号)、浮点数、字符和字符串进行多种方式的格式化。下面将通过一系列示例来详细介绍。
### 2.1 技术要求
继续使用之前选择的工具,源代码可在 [此处](https://github.com/PacktPublishing/Learn-C-Programming) 找到。
### 2.2 回顾 `printf()`
之前使用 `printf()` 进行输出时,格式化较为简单。实际上,它为无符号整数、指针、有符号整数、浮点数、字符和字符串提供了丰富的格式说明符。
### 2.3 理解格式说明符的通用形式
格式说明符通常以 `%` 开头,按顺序包含以下元素:
- **零个或多个标志字符**:
- `-`:左对齐,缺省时为右对齐。
- `+`:显示正负号;空格:仅显示负号。
- `0`:零填充。
- `#`:特定格式变体,取决于转换类型。
- **可选的最小字段宽度**:以十进制整数常量表示。
- **可选的精度说明**:以 `.` 开头,可选地后跟十进制整数常量。
- **可选的大小修饰符**:
- 长或长长:`l`、`ll` 或 `L`。
- 短或字节:`h` 或 `hh`。
- 特定类型:`j`、`z` 或 `t`。
- **转换操作**:单个字符,如 `d`、`i`、`o`、`u`、`x`、`X`、`n`、`p`、`a`、`A`、`e`、`E`、`f`、`F`、`g`、`G`、`c`、`s`、`%`。
例如,`%-#012.4hd` 格式说明符将有符号整数转换为短整数,左对齐,用零填充 12 个字符的字段,精度为 4 位小数。
## 3. 无符号整数的格式说明符
### 3.1 示例程序 `unsignedInt.c`
```c
#include <stdio.h>
int main( void ) {
int smallInt = 12;
int largeInt = (1024*1024*3)+(1024*2)+512+128+64+32+16+8+4+2+1;
int negativeInt = -smallInt;
unsigned anUnsigned = 130;
// 其他代码片段将放在这里
}
```
### 3.2 不同进制下的无符号整数
```c
printf( " Unsigned Printf \n" );
printf( " Base Base-8 Base-10 Base-16 BASE-16\n" );
printf( " Name octal unsigned hexadeximal HEXIDECIMAL\n" );
printf( " Specifier %%12o %%12u %%12x %%12X \n" );
printf( " [%12o] [%12u] [%12x] [%12X]\n" , smallInt , smallInt , smallInt , smallInt );
printf( " [%12o] [%12u] [%12x] [%12X]\n\n" , largeInt , largeInt , largeInt , largeInt );
printf( " [%12o] [%12u] [%12x] [%12X]\n\n" , anUnsigned , anUnsigned , anUnsigned , anUnsigned );
```
使用 `#` 标志的代码片段:
```c
printf( " Specifier %%#o %%#u %%#x %%#X\n");
printf( " [%#12o] [%12u] [%#12x] [%#12X]\n" , smallInt , smallInt , smallInt , smallInt );
printf( " [%#12o] [%12u] [%#12x] [%#12X]\n" , largeInt , largeInt , largeInt , largeInt );
printf( " [%#12o] [%12u] [%#12x] [%#12X]\n\n" , anUnsigned , anUnsigned , anUnsigned , anUnsigned );
```
这里可以看到八进制数前有 `0`,十六进制数前有 `0x` 或 `0X`。
### 3.3 将负数视为无符号整数
```c
printf( " Negative Numbers as Unsigned:\n" );
printf( " -0 [%12o] [%12u] [%12x] [%12X]\n" , -0 , -0 , -0 , -0 );
printf( " -1 [%12o] [%12u] [%12x] [%12X]\n" , -1 , -1 , -1 , -1 );
printf( " -2 [%12o] [%12u] [%12x] [%12X]\n" , -2 , -2 , -2 , -2 );
printf( " -12 [%12o] [%12u] [%12x] [%12X]\n\n" , negativeInt , negativeInt , negativeInt , negativeInt );
```
负数在计算机系统中采用补码表示,`printf()` 会根据指定的类型转换对给定值的位模式进行格式化。
### 3.4 不同进制下 2 和 9 的幂
```c
printf( "Powers of 2: 2^0, 2^2, 2^4, 2^6, 2^8 , 2^10\n" );
int k = 1;
for( int i = 0 ; i < 6 ; i++ , k<<=2 ) {
printf( " [%#12o] [%12u] [%#12x] [%#12X]\n" , k , k , k , k );
}
printf( "\nPowers of 9: 9^1, 9^2, 9^3, 9^4\n" );
printf( " Specifier %%12o %%12u %%12x %%12X \n" );
k = 9;
for( int i = 0 ; i < 5 ; i++ , k*=9 ) {
printf( " [%#12o] [%12u] [%#12x] [%#12X]\n" , k , k , k , k );
}
```
此代码有助于理解八进制和十六进制计数,其中十六进制更为常用。
### 3.5 打印指针值
```c
printf( "\nPointer Output\n" );
printf( " %%p [%p] pointer\n" , &smallInt );
printf( " %%#lx [%#lx] using hex\n\n" , (unsigned long)&smallInt );
```
`p` 类型转换更简单安全,而 `#lx` 需要将指针地址强制转换为无符号长整型。
## 4. 有符号整数的格式说明符
### 4.1 示例程序 `signedInt.c`
```c
#include <stdio.h>
int main( void ) {
int smallInt = 12;
int largeInt = 0x7fffffff; // int32 max
int negativeInt = -smallInt;
unsigned anUnsigned = 130;
long long int reallyLargeInt = 0x7fffffffffffffff; // int64 max
// 其他代码片段将放在这里
}
```
### 4.2 有符号整数的字段宽度、精度、对齐和零填充
```c
printf( " Signed Printf \n" );
printf( " Name right left zero right left\n" );
printf( " aligned aligned filled minimum minimum whatever\n" );
printf( " Specif
```
0
0
复制全文
相关推荐










