问题描述:输入字符串(长度为16的倍数),以规定格式输出。
输入:
abcdefghijklmnopqrststrqponmlkjihgfedcba
输出:
各行的格式分析
00000000
- 00000010
-00000020
:其中00和10代表的是一个十六进制数,转换为十进制就是0、16、32;格式化输出,采用C语言的printf()函数
printf()函数
原型:extern int printf(const char *format,...);
返回值:返回的是输出字符的个数
Format 参数是包含三种对象类型的一个字符串:
printf("hello");
包含%d等
包含\n等
通常意义上format的格式如下:
%[flags][width][.prec]type
type
printf(“%.*s\n”,m,n,ch);其中前边定义的是总的宽度,后边*是指定输出字符个数。分别对应外边参数m和n。
%d十进制、%o(字母0,八进制数是数字0)、%x十六进制
flags
0 数字零:将输出的前面补上0,直到占满指定列宽为止(不可以搭配使用’-‘)
width
用于控制显示数值的宽度,取值和含义如下:
n(n=1,2,3,4,5,6…): 宽度至少为n位,不够默认以空格填充。
width是一个可选的指定最小值字段宽度的十进制数字字符串。如果转换值字符少于字段宽度,该字段将从左到右按指定的字段宽度填充。如果指定了左边调整选项,字段将在右边填充。如果转换结果宽于字段宽度,将扩展该字段以包含转换后的结果。不会发生截断。然而,小的精度可能导致在右边发生截断。
.prec
用于控制小数点后面的位数,取值和含义如下:
1)无按缺省精度显示0
当type=d,i,o,u,x时,没有影响;type=e,E,f时,不显示小数点
2)n(n=1,2,3…)
当type=e,E,f时表示的最大小数位数; type=其他,表示显示的最大宽度
3)prec是指可选的精度。精度是一个.(点)后跟十进制数字字符串。如果没有给出精度,按 0(零)对待。精度指定:
* d、o、i、 u、x 或 X 转换的最少数字显示位数。
* e 和 f 转换的基数字符后的最少数字显示位数。
* g 转换的最大有效数字位数。
* s 转换中字符串的最大打印字节数目。
.precision 表示输出精度。
对于 %d,.precision 表示的其实是最小输出宽度,与 width 不同的是,不足的宽度以 0 补齐,例如:
printf(“%.10d\n”, 4309);
输出结果为:
0000004309
#include
#include
const int MAX = 16 * 100;
int main(void) {
//获取、输出字符串
char str[MAX];
gets(str);
puts(str);
int MaxLine = (int)strlen(str) / 16;//总行数
int MaxLen = strlen(str);
int i = 1;//控制输出行数
int j = 0;//控制输出字符
int k = 0;//控制输出字符串
for (; i <= MaxLine; i++) {
//第一部分
printf("%08x ", 16*(i-1) );
//第二部分
for (; j < MaxLen; j++) {
printf("%x ", str[j]);
if (j == 16*i-1) {
j += 1;
break;
}
}
printf(" ");
//第三部分
for (; k <= j - 1; k++) {
printf("%c", str[k]);
}
printf("\n");
}
return 0;
}
//测试字符串:
// abcdefghabcdefghhgfedcbaabczxcvbabcdefghabcdefghhgfedcbaabczxcvb