求C语言高人帮助,纯C编写IP转换数字程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求C语言高人帮助,纯C编写IP转换数字程序相关的知识,希望对你有一定的参考价值。

如题
最好有个简单的对话框通过输入IP操作来实现,谢谢

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//从字串p中获取ip整数到整数数组a,成功返回0,失败返回1
int getipaddress(char *pp, int *a)
int d[5]=-1,di=1,ai=0;
int i,j,m;
char *p;
p=(char *)malloc(sizeof(char)*strlen(pp));
strcpy(p,pp);    //把来源的pp地址复制下来,要不然pp的内容可能是常数,将无法修改 

//删除p中非数字,非小数点的字符
for(i=strlen(p)-1;i>=0;i--)
if(p[i]!='.' && (p[i]<'0' || p[i]>'9'))
for(j=i;j<strlen(p);j++)
 p[j]=p[j+1];

//检查获取小数点所在的位置
if (p[0]=='.') return 1;     //小数点在第一位,错误 
for(i=0;i<strlen(p);i++)
if(p[i]=='.') 
d[di++]=i;
if (di>4) return 1;   //小数点数量超过3个,错误 

if (di!=4) return 1;   //小数点数量少于3个,错误 
d[4]=strlen(p);

//计算各ip的分段值
for(i=0;i<4;i++)
m=0;
for(j=d[i]+1;j<=d[i+1]-1;j++)
m=m*10+p[j]-'0';
if (m<0 || m>255) return 1; //整数的数值过大 
a[i]=m;

free(p);
return 0;
 
int main()
int address[4];
char *p="192.168.0.1";
int i,k;
k=getipaddress(p,address);
if (k==0)
for(i=0;i<4;i++)
printf("%d ",address[i]);
else
printf("错误的ip地址\\n"); 

追问

你好,我运行之后怎么什么也不显示

追答

参考技术A unsigned int ip2int(const char *str) 
    int a[4];

    //64位大端对齐
    sscanf(str, "%d.%d.%d.%d", &a[3], &a[2], &a[1], &a[0]);

    unsigned int number;

    char *p = (char *) &number;

    for (int i = 0; i < 4; ++i) 
        p[i] = (char) a[i];
    

    return number;

linux下,编写一个c语言程序实现...(详细见正文)!急!

编写一个程序,实现 能够批量处理查询IP归属地 最终实现统计各段IP(以国家为最小分配单位)归属地的个数。实现:1.将IP数据段分成不同数组便于分类 2.将要处理的大量IP 处理实现分类
急求~~ 有高手帮忙么 万谢
ip数据库是随机的, 比如说 给你1W个不同的IP地址,让我进行分类统计..、
程序最终实现的是:输入 批量IP地址 之后 经过程序 能自动统计,各个IP 所属地区的 个数
有高人 能帮忙解决下么 我qq 601387066

//没有统计功能,要的话再Hi我

/*
程序功能:查询IP
使用方法:
将IP库保存为c:\data.txt,将要查询的IP保存为c:\ip.txt;编译好本程序后,运行后产生c:\result.txt结果文件

程序BUG:data文件最后需要以两个换行结束

*/

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

#define TOTAL_INFO 100

extern void str_init(char* str1, char* str2, char* str3, char* str4); //字符串初始化函数
extern void str_init_total_info(char *str);
extern int read_file(FILE *fp, char *str); //读取IP
extern void read_dt2_next(FILE *fp, char *str); //单独保存数据库中第二IP段,最大IP范围
extern void next_line_data(FILE *fp); //专用:跳到下一行
extern void next_line_ip(FILE *fp);
extern int total_line(FILE *fp); //检测文件总行数

int main(int argc, char *argv[])


FILE *fp_data, *fp_ip, *fp_result;

char t_dt1[5], t_dt2[5], t_dt3[5], t_dt4[5];
char t_ip1[5], t_ip2[5], t_ip3[5], t_ip4[5]; //4个IP段,便于比较和保存
char t_dt2_next[5]; //保存数据库中同一行第二IP段,最大IP范围
char addr_ip[50]; //输出处理后的IP归属地
char temp;
char ip_total_info[30];

int flag_loop_ip=1, flag_loop_data=1;
int i=0, j=0, k=0, flag_complete=0;
int len_dt1, len_dt2;
int len_ip1, len_ip2;
int total_line_nu=0;

str_init(t_dt1, t_dt2, t_dt3, t_dt4); //初始化:将字符串以'\0'填充
str_init(t_ip1, t_ip2, t_ip3, t_ip4);
str_init_total_info(ip_total_info);

fp_data=fopen("c:\\data.txt", "r");
fp_ip=fopen("c:\\ip.txt", "r");
fp_result=fopen("c:\\result.txt", "a+"); //追加文件,若存在

total_line_nu=total_line(fp_ip); //获取ip.txt文件的总行数

fseek(fp_ip, 0, SEEK_SET); //将fp_ip移动到文件开头

for(i=0; i<total_line_nu; i++) //外层总循环,由ip.txt文件的总行数控制


flag_complete=0;

len_ip1=read_file(fp_ip, t_ip1);
len_ip2=read_file(fp_ip, t_ip2);
read_file(fp_ip, t_ip3);
read_file(fp_ip, t_ip4);

for(j=0; flag_complete == 0; j++) //内层总循环,控制条件:是否完成一次比较

len_dt1=read_file(fp_data, t_dt1); //读取各段IP,并保存各段IP长度
len_dt2=read_file(fp_data, t_dt2);
read_file(fp_data, t_dt3);
read_file(fp_data, t_dt4);

read_dt2_next(fp_data, t_dt2_next); //单独保存数据库中第二IP段,最大IP范围

fseek(fp_data,9,SEEK_CUR); //文件指针后移9位,指向汉字将要出现的地方

fgets(addr_ip, 20 , fp_data); //单独保存IP信息(汉字)

for(k=0; (temp=fgetc(fp_data)) != '\n'; k++) //此处为了使主程序的内层循环自动换行




// fseek(fp_data,2,SEEK_CUR); //使fp_data指向下一行

// next_line(fp_data);

if(len_dt1==len_ip1 && len_dt2==len_ip2) //如果各段IP都一样长,则比较

if( !strcmp(t_dt1, t_ip1) ) //如果第一段的IP内容一样,比较第二段

if( ((strcmp(t_dt2, t_ip2)) <= 0) && ((strcmp(t_dt2_next, t_ip2)) >= 0) )
//如果要查询IP在这个IP段(BUG为:最小范围和最大范围个数不一样)

flag_complete = 1; //完成一次循环

strcpy(ip_total_info,t_ip1); //整理要输出的信息
strcat(ip_total_info,".");
strcat(ip_total_info,t_ip2);
strcat(ip_total_info,".");
strcat(ip_total_info,t_ip3);
strcat(ip_total_info,".");
strcat(ip_total_info,t_ip4);
strcat(ip_total_info,"\t");
strcat(ip_total_info,addr_ip);

fputs(ip_total_info, fp_result);

fseek(fp_data, 0, SEEK_SET); //将fp_data移动到文件开头






//不满足条件时返回循环,因为readfile函数的设置,不用再重置到下一行





// printf("ftell:%d\n",ftell(fp_data)); //获取文件流的读取位置

// fseek(fp,2,SEEK_CUR); //

fclose(fp_data);
fclose(fp_ip);
fclose(fp_result);
return 0;


void str_init(char *str1, char *str2, char *str3, char *str4)

int i;
for(i=0; i<5; i++)

str1[i]='\0';
str2[i]='\0';
str3[i]='\0';
str4[i]='\0';



///////////////////////////////////////////////////////////////////////////////////////////////////
int read_file(FILE *fp, char* str)

int i, len;
char t;

for(i=0; ( (str[i]=fgetc(fp)) >= '0') && (str[i] <= '9'); i++) //从文件中读取字符串,直到非数字结束



str[i] = '\0'; //将最后读取的非数字填充掉

len=strlen(str);
return len;



void read_dt2_next(FILE *fp, char *str) //单独保存数据库中第二IP段,最大IP范围

char temp;
int flag=0,i;

for (i=0; flag != 1; i++ ) //直到找到第二段最大范围IP

temp = fgetc(fp);
if(temp == '.') //第二段IP以第一段的.开始

flag = 1;



//保存找到的第二段最大范围IP
for(i=0; ( (str[i]=fgetc(fp)) >= '0') && (str[i] <= '9'); i++) //从文件中读取字符串,直到非数字结束



str[i] = '\0'; //将最后读取的非数字填充掉



void next_line_data(FILE *fp) //使文件指针指向下一行

char t;
t=fgetc(fp);
while(t != '\n')

// printf("temp t:%c\n", t);
// system("pause");

t=fgetc(fp);


t=fgetc(fp);
if (t != '\n')

fseek(fp,-1,SEEK_CUR);

else

t=getc(fp);
if (t != '\n')

fseek(fp,-1,SEEK_CUR);


//fseek(fp,4,SEEK_CUR); //精确定位到下下一行,因为两行之间有一个空白行
//t=fgetc(fp); //读取换行符,使文件指针指向下一行



void next_line_ip(FILE *fp) //使文件指针指向下一行

char t;
t=fgetc(fp);
while(t != '\n')

// printf("temp t:%c\n", t);
// system("pause");

t=fgetc(fp);

fseek(fp,2,SEEK_CUR); //精确定位到下下一行,因为两行之间有一个空白行
//t=fgetc(fp); //读取换行符,使文件指针指向下一行



int total_line(FILE *fp) //检测总行数

char t1, t2;
int flag=0, flag2=0;
t1 = fgetc(fp);
t2 = fgetc(fp);
while (t1 != EOF) //到达文件尾或出错返回EOF

if( (t1 == '\n') && (t1=fgetc(fp) != EOF))

flag2=0;
flag+=1;

else flag2=1;

t1 = fgetc(fp);


flag=flag+flag2;
return flag;



void str_init_total_info(char *str)

int i;
for(i=0; i<TOTAL_INFO; i++)

str[i]='\0';

参考技术A 这个就像查询电话号码归属地一样,每个省份或者直辖市的电话号码都有一个区号以示区别。只要提取除区号这个特征码就可以区别电话号码了。同理你得知道以国家为最小分配单位归属地IP的统计,必须得提取一个区别于其他国家的IP地址特征码吧?IPV4中有32比特位,是不是其中有几位表示的是地域信息。这个我网上查了下,也差不到。你自己再查查看。至于说随机生成数用rand不就可以了.关键是找到一个特征码来区分。小弟也是菜鸟,具体特征码ip我也没查到

以上是关于求C语言高人帮助,纯C编写IP转换数字程序的主要内容,如果未能解决你的问题,请参考以下文章

linux下,编写一个c语言程序实现...(详细见正文)!急!

程序设计:将一个数字字符串转换成与其面值相同的长整型整数

在C语言中,如何将字符串“192.168.1.1”转换成MAC地址或IP地址?

C语言程序设计的一道题,一个把阿拉伯数字转换成中文大写数字的程序。我自己编写如下:

编写一个C程序,将用户输入的数字转换成中文大写,比如输入123,输出“壹贰叁”

C语言 如何将字符串转换成数字。不用指针和函数库,求解答