2013-12-14 83 views
0

我從字符串格式數據庫中讀取IP地址,但我想告訴他們的IP格式類似192.168.100.155將輸入的字符串IP地址格式

char formatAs_Ipaddress(const char *str) 

此功能會格式化傳遞到字符串它的形式是IP地址,即255001001001將返回爲255.1.1.1

我可以爲我的查​​詢獲得更優化的方式嗎?

+0

你有什麼確切的輸入?什麼是字符串和什麼是ip格式? – esskar

+0

這裏我正在考慮一個Ipv4地址輸入字符串,類似於192168010010,我的預期輸出來自此函數是192.168.10.10 –

+0

爲什麼您將問題標記爲C++並提出C風格的解決方案? –

回答

1

我試過這樣做,它爲我工作。

char formatAs_Ipaddress(const char* str) { 
    char getval; 
    if(str!=0) { 
     char temp[256]; memset(temp,0,256); 
     int len = strlen(str); 
     int cnt = 0; 
     for(int i=0,j=0;i<len;++i) { 
      temp[j] = str[i]; 
      if(i>=11) { 
       break; 
      } 
      ++j; 
      ++cnt; 
      if(cnt!=0 && cnt%3==0) { 
       temp[j]='.'; 
       ++j; 
      } 
     } 
     getval = temp; 
    } 
    return getval; 
} 
+1

這是否編譯? – esskar

0
char *format_ipaddress(const char *input, char *output, int size) 
{ 
    if (input == NULL || output == NULL || size < 16) // invalid parameters 
     return NULL; 

    int len = strlen(input); 
    if (len != 12) // input looks invalid 
     return NULL; 

    char *outptr = output; 
    for(int i = 0; i <= 9; i += 3) 
    { 
     char *inptr = input + i; 
     int inlen = 3; 
     while (inlen > 1 && *inptr == '0') 
     { 
      // remove zeros at beginning of subnet block 
      ++inptr; 
      --inlen; 
     } 

     memcpy(outptr, inptr, inlen); 
     outptr += inlen; 

     if (i < 9) 
      *outptr++ = '.'; 
    } 
    *outptr = 0; // ensure output ends with a \0 

    return output; 
} 


char *input = "192168010010"; 
char output[16]; 
char *result; 

result = format_ipaddress(input, output, sizeof(output)); 
if (result != NULL) 
{ 
    printf("'%s' formated as ip address: '%s'", input, result); 
} 
else 
{ 
    printf("Something went wrong. Check your input.\n"); 
}