zoukankan      html  css  js  c++  java
  • 关于格式化字符串以及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是规定了最小值,超过时阶段,不足时不填充

  • 相关阅读:
    基于摸板匹配的目標跟蹤算法
    spoj 2713 Can you answer these queries IV
    zoj 3633 Alice's present
    hdu 3642 Get The Treasury
    poj 1195 Mobile phones
    poj 2760 End of Windless Days
    zoj 3540 Adding New Machine
    spoj 1716 Can you answer these queries III
    spoj 1043 Can you answer these queries I
    spoj 2916 Can you answer these queries V
  • 原文地址:https://www.cnblogs.com/tclan126/p/8443176.html
Copyright © 2011-2022 走看看