IPV4 地址和整形转换程序实现

前言
最近看道一个面试题目,大体意思就是将ip地址,例如“192.168.1.116”转换成int类型,同时还能在转换回去

思路
ip地址转int类型,例如ip为“192.168.1.116”,相当于“.“将ip地址分为了4部分,求其转换成int 型及:192*256^3 + 168*256^2 + 1*256 + 116*1。

int类型转ip地址,思路类似,除以权值即可,但是有部分字符串的操作

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
 
#define LEN 16
 
typedef unsigned int uint;
 
/**
 * 字符串转整形 192.168.0.10
 */
uint ipTint(char *ipstr)  
{
	if (ipstr == NULL)	return 0;
 
	char *token;
	uint i = 3, total = 0, cur;
 
	token = strtok(ipstr, ".");   /*strtok获取遇到‘.’前的字符 token = "192" */
 
	while (token != NULL) {
		cur = atoi(token);        /* 第一次循环cur=192 */
		if (cur >= 0 && cur <= 255) {
			total += cur * pow(256, i);
		}
		i --;
        /*一种算法,可参照 https://www.runoob.com/cprogramming/c-function-strtok.html  */
		token = strtok(NULL, ".");
	}
 
	return total;
}
 
/**
 * 逆置字符串
 */
void swapStr(char *str, int begin, int end)
{
	int i, j;
 
	for (i = begin, j = end; i <= j; i ++, j --) {
		if (str[i] != str[j]) {
			str[i] = str[i] ^ str[j];
			str[j] = str[i] ^ str[j];
			str[i] = str[i] ^ str[j];
		}
	}
}
 
/**
 * 整形转ip字符串
 */
char* ipTstr(uint ipint)
{
	char *new = (char *)malloc(LEN);
	memset(new, '\0', LEN);
	new[0] = '.';
	char token[4];
	int bt, ed, len, cur;
 
	while (ipint) {
		cur = ipint % 256;
		sprintf(token, "%d", cur);
		strcat(new, token);
		ipint /= 256;
		if (ipint)	strcat(new, ".");
	}
 
	len = strlen(new);
	swapStr(new, 0, len - 1);
 
	for (bt = ed = 0; ed < len;) {
		while (ed < len && new[ed] != '.') {
			ed ++;
		}
		swapStr(new, bt, ed - 1);
		ed += 1;
		bt = ed;
	}
 
	new[len - 1] = '\0';
 
	return new;
}
 
int main(void)
{
	char ipstr[LEN], *new;
	uint ipint;
 
	while (scanf("%s", ipstr) != EOF) {
		ipint = ipTint(ipstr);
		printf("%u\n", ipint);
 
		new = ipTstr(ipint);
		printf("%s\n", new);
	}
 
	return 0;
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值