7. IP地址整数和字符串之间转换

题目

把一个整数转换为点分十进制字符串, 或者把点分十进制字符串转化为整数

思路

这个主要两点:

  1. ip地址 我们看到的都是10.189.132.132这样的, 如果按照字符串来保存, 那就需要15 char, 因为每一section都是0-255, 所以就可以用unsigned char来保存, 一个整数就搞定
  2. 需要充分理解指针的概念。指针也是有类型的,指针的类型决定了指针的步长

错误的代码实现

首先一个错误的示范:请大家一定要仔细理解

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define IP "78.97.188.0"

void intToString(int a) {
	char ip[128] = "";
	unsigned int b;

	sprintf(ip, "%u.%u.%u.%u",  *((unsigned char *)&a),
								*((unsigned char *)&a + 1),
								*((unsigned char *)&a + 2),
								*((unsigned char *)&a + 3));

	printf("%s\n", ip);
}

void stringToInt(char *ip) {
	unsigned char array[4] = {0};
	int i;
	unsigned int b = 0;

	printf("|%s|\n", ip);
	unsigned char *point = (unsigned char *)&b;
	printf("---------point = %p-------------\n", point);

	printf("---------array = %p-------------\n", array);
	sscanf(ip, "%u.%u.%u.%u", array, array + 1, array + 2, array + 3);

	printf("---------array = %p-------------\n", array);

	printf("---------%p-------------\n", point);
	for (i = 0; i < 4; ++i) {
		printf("%u\n", array[i]);
		point[i] = array[i];
	}
	
	printf("%u\n", b);
}
int main()
{
	intToString(123456789);
	stringToInt(IP);
	return 0;
}

输出结果:
在这里插入图片描述

请大家注意, point 的地址被改变了。这是为什么呢?
错误就出在该死的sscanf上面, 前面申请的array 是unsigned char, 但是读取时候用的%u, 这可是要4字节的。直接就把point变量的数值给改变了!

正确的代码实现

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define IP "78.97.188.0"

void intToString(int a) {
	char ip[128] = "";
	unsigned int b;
//请注意这里的输出类型, 用%u 输出是有问题的, 只是这里凑巧array 后面没有占变量了。有的话就会被覆盖
	sprintf(ip, "%hhu.%hhu.%hhu.%hhu",  *((unsigned char *)&a),
								*((unsigned char *)&a + 1),
								*((unsigned char *)&a + 2),
								*((unsigned char *)&a + 3));

	printf("%s\n", ip);
}

void stringToInt(char *ip) {
	unsigned char array[4] = {0};
	int i;
	unsigned int b = 0;

	printf("|%s|\n", ip);
	unsigned char *point = (unsigned char *)&b;

	sscanf(ip, "%hhu.%hhu.%hhu.%hhu", array, array + 1, array + 2, array + 3);
// 这里其实要不要都行, 我们已经把数据放到array 里了, 直接强制转换输出就行,对应下面的第一个输出。这里只是为了对比上面的栈溢出问题。
	for (i = 0; i < 4; ++i) {
		point[i] = array[i];
	}
	
	printf("%u\n", *((unsigned int *)array));
	printf("%u\n", b);
}
int main()
{
	intToString(123456789);
	stringToInt(IP);
	return 0;
}

运行结果

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值