题目
把一个整数转换为点分十进制字符串, 或者把点分十进制字符串转化为整数
思路
这个主要两点:
- ip地址 我们看到的都是10.189.132.132这样的, 如果按照字符串来保存, 那就需要15 char, 因为每一section都是0-255, 所以就可以用unsigned char来保存, 一个整数就搞定
- 需要充分理解指针的概念。指针也是有类型的,指针的类型决定了指针的步长
错误的代码实现
首先一个错误的示范:请大家一定要仔细理解
#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;
}