关于格式化字符串以及16进制与点分十进制转换的理解

由点分十进制转成16进制

思路是获得点分十进制的字符串后由inet_pton函数将该字符串转换成

一个二进制数组由val存储

然后用"%02x"格式字符串来打印出来它的flags为0即用零填充

width为2即宽最小为2不足则填充

#include <arpa/inet.h>
#include <stdio.h>
int main(int argc,char **argv) {
  char *pstring = argv[1];
  unsigned char val[4] = {0};

  inet_pton(AF_INET,pstring,val);

  size_t c;
  printf("0x");
  for(c = 0;c < sizeof val / sizeof *val;c++)
    printf("%02x",val[c]);
  printf("
");
  return 0;
}

这个过程则是与上面相反的过程

首先得到hexstring即16进制的字符串

然后用sscanf将字符串解释成2进制数组

这里"%2hhx" 2为width即一次最多读入2个字符并且将它们解释成16进制数存于val中

然后用inet_ntop函数将它们转换成点分十进制用dst指向它,测试了一下buf中的内容也是这个点分十进制

#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>

int main(int argc,char **argv) {
  char *hexstring = argv[1],*pos = hexstring+2;
  unsigned char val[4] = {0};
  size_t c;
  for(c = 0;c < 4;c++) {
    sscanf(pos,"%2hhx",&val[c]);
    pos += 2;
  }
  
  unsigned char *src = val;
  char buf[INET_ADDRSTRLEN];
  const  char *dst;
  dst = inet_ntop(AF_INET,src,buf,INET_ADDRSTRLEN);
  printf("%s
",dst);
  return 0;
}

最后比较一下了下列区别

printf("%3s
","abcedfg");
printf("%.3s
","abcedfg");

=> abcedfg

=>abc

可见对于width的number是规定了最小值,超过时不截断,不足时加填充位

而对于precision的number是规定了最小值,超过时阶段,不足时不填充

原文地址:https://www.cnblogs.com/tclan126/p/8443176.html