Search code examples
cipv4

Comparing strings containing IPv4 addresses in C


I have two strings ip1 = "192.168.145.123" and ip2 = "172.167.234.120".

I can compare these two strings for equality:

strncmp(ip1,ip2) == 0

However how can I find out

if (ip1 > ip2) {
    ...
}

What I have tried

I can use sscanf:

sscanf(ip1,"%d.%d.%d.%d",&s1,&s2,&s3,&s4) 

and store the numbers and compare. However in 32 bit I can't store the numbers as integers due to the upper limit.

Thus I have no choice but to compare the integers as strings.


Solution

  • You can try the sexy way, store all values in one unsigned integer and compare it.

      const char* ip1 = "192.168.145.123";
      const char* ip2 = "172.167.234.120";
    
      unsigned char s1, s2, s3, s4;
      unsigned int uip1, uip2;
    
      sscanf(ip1,"%hhu.%hhu.%hhu.%hhu",&s1,&s2,&s3,&s4);
      uip1 = (s1<<24) | (s2<<16) | (s3<<8) | s4; //store all values in 32bits unsigned int
    
      sscanf(ip2,"%hhu.%hhu.%hhu.%hhu",&s1,&s2,&s3,&s4);
      uip2 = (s1<<24) | (s2<<16) | (s3<<8) | s4;
    
      if (uip1 > uip2)
      {
        printf("ip1 greater !");   
      }
      else
      {
        printf("ip2 greater or equal !");     
      }