2017腾讯实习生笔试题简单练习——给定字符串,以十六进制和规定格式输出

问题描述:输入字符串(长度为16的倍数),以规定格式输出。
输入:
  abcdefghijklmnopqrststrqponmlkjihgfedcba
输出:
2017腾讯实习生笔试题简单练习——给定字符串,以十六进制和规定格式输出_第1张图片

输入字符串再大一点的话:
2017腾讯实习生笔试题简单练习——给定字符串,以十六进制和规定格式输出_第2张图片

解决方案

需求分析

各行的格式分析

  • 00000000 - 00000010-00000020:其中00和10代表的是一个十六进制数,转换为十进制就是0、16、32;
  • 第二大部分是将每个字符以十六进制输出,每次输出16个;
  • 第三大部分是前16个字符组成的字符串
  • 需要注意的细节是:空格、换行

问题关键

格式化输出,采用C语言的printf()函数

printf()函数
原型:extern int printf(const char *format,...);
返回值:返回的是输出字符的个数
Format 参数是包含三种对象类型的一个字符串:

  • 无格式字符复制到输出流;printf("hello");
  • 转换规范,每个规范导致在值参数列表中检索 1 个或更多个项;包含%d等
  • 转义序列。包含\n等

通常意义上format的格式如下:
%[flags][width][.prec]type

type
2017腾讯实习生笔试题简单练习——给定字符串,以十六进制和规定格式输出_第3张图片
printf(“%.*s\n”,m,n,ch);其中前边定义的是总的宽度,后边*是指定输出字符个数。分别对应外边参数m和n。

%d十进制、%o(字母0,八进制数是数字0)、%x十六进制

flags
2017腾讯实习生笔试题简单练习——给定字符串,以十六进制和规定格式输出_第4张图片
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

运行结果:
2017腾讯实习生笔试题简单练习——给定字符串,以十六进制和规定格式输出_第5张图片

你可能感兴趣的:(2017腾讯实习生笔试题简单练习——给定字符串,以十六进制和规定格式输出)