1. 程式人生 > >關於格式化字符串以及16進制與點分十進制轉換的理解

關於格式化字符串以及16進制與點分十進制轉換的理解

std nbsp 測試 超過 hex spa inet_pton number body

由點分十進制轉成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("\n"); 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\n",dst); return 0; }

最後比較一下了下列區別

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

=> abcedfg

=>abc

可見對於width的number是規定了最小值,超過時不截斷,不足時加填充位

而對於precision的number是規定了最小值,超過時階段,不足時不填充

關於格式化字符串以及16進制與點分十進制轉換的理解