在windows下用C语言怎样从文档中读取IP地址并将其转换成unsiged long型的

即一个IP存入一个unsiged long中,
文档
202.112.1.1 / 255.255.255.0
202.112.1.2 / 255.255.255.0
202.112.2.1 / 255.255.255.0

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*字符串形式 IP 转换为一个整数
参数:
strIP 字符串形式的IP
intIP 转换成功后的整数
返回:
如果转换失败,返回0;否则返回1
*/
int strToInt(char strIP[],unsigned long *intIP)
{
int length = strlen(strIP);
int i=0,k=3,part=0;
*intIP=0;
for(i=0;i<=length;i++)
{
if(strIP[i]=='.' || strIP[i]=='\0')
(*intIP) |= (part<<(k--*8)) , part=0;
else if(strIP[i]>='0' && strIP[i]<='9')
part=part*10+(strIP[i]-'0');
else
return 0;
}
return 1;
}
/*字符串形式 IP 转换为一个整数
参数:
intIP 整数形式的 IP
strIP 转换字符串形式的IP
返回:
如果转换失败,返回0;否则返回1
*/
int intToStr(unsigned long intIP,char strIP[])
{
int buf[4],i;
for(i=0;i<4;i++)
{
buf[i]=intIP%256;
intIP/=256;
}

if(intIP !=0)
return 0;
else
{
sprintf(strIP,"%d.%d.%d.%d",buf[3],buf[2],buf[1],buf[0]);
return 1;
}
}

int main(int argc, char *argv[])
{
char strIP[16];
unsigned long intIP;
// ip 保存在 ips.txt 文件中,这里用了输入重定向,以方便输入。
if(freopen("ips.txt","r",stdin)!=NULL)
{
// 循环读取字符串知道文件末尾
while(scanf("%s",strIP) !=EOF)
{
// 字从符串IP整数IP
if(strToInt(strIP,&intIP))
{
printf("字符串IP转换为一个整数:%s(字符串) = %lu(十进制) = %lX(十六进制)\n",strIP,intIP,intIP);

// 进行反向转换,从整数IP,转换为字符串IP,以验证转换的正确性
intToStr(intIP,strIP);
printf("一个整数转换为字符串IP:%lu(十进制) = %lX(十六进制) = %s(字符串)\n\n",intIP,intIP,strIP);
}
else
{
printf("%s 不是一个合法的IP!\n\n",strIP);
}
}
}
else
{
printf("无法打开ip文件!\n");
}
scanf("%d",&intIP);
system("pause");
return 0;
}
/*
字符串IP转换为一个整数:202.112.1.1(字符串) = 3396337921(十进制) = CA700101(十
六进制)
一个整数转换为字符串IP:3396337921(十进制) = CA700101(十六进制) = 202.112.1.1(
字符串)

/ 不是一个合法的IP!
字符串IP转换为一个整数:255.255.255.0(字符串) = 4294967040(十进制) = FFFFFF00(
十六进制)
一个整数转换为字符串IP:4294967040(十进制) = FFFFFF00(十六进制) = 255.255.255.0
(字符串)

字符串IP转换为一个整数:202.112.1.2(字符串) = 3396337922(十进制) = CA700102(十
六进制)
一个整数转换为字符串IP:3396337922(十进制) = CA700102(十六进制) = 202.112.1.2(
字符串)

/ 不是一个合法的IP!
字符串IP转换为一个整数:255.255.255.0(字符串) = 4294967040(十进制) = FFFFFF00(
十六进制)
一个整数转换为字符串IP:4294967040(十进制) = FFFFFF00(十六进制) = 255.255.255.0
(字符串)

字符串IP转换为一个整数:202.112.2.1(字符串) = 3396338177(十进制) = CA700201(十
六进制)
一个整数转换为字符串IP:3396338177(十进制) = CA700201(十六进制) = 202.112.2.1(
字符串)

/ 不是一个合法的IP!
字符串IP转换为一个整数:255.255.255.0(字符串) = 4294967040(十进制) = FFFFFF00(
十六进制)
一个整数转换为字符串IP:4294967040(十进制) = FFFFFF00(十六进制) = 255.255.255.0
(字符串)

*/
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-09-18

1、可以先使用fgets读取每行字符串,然后在使用sscanf函数分别读取该字符串中每一个ip地址到一个unsigned long类型当中。

2、例程:

#include<stdio.h>
#include<stdlib.h>
#include<Winsock2.h>
int main()
{
char buff[128],ip1[16],ip2[16];
unsigned long ip_num1,ip_num2;
FILE *rd;
rd = fopen("ip.txt", "r");
if(rd != NULL)
{
fread(buff, 128, 1, rd);
printf("%s\n",buff);
}
else
{
printf("open error\n",buff);
}
sscanf(buff, "%s / %s", ip1, ip2);//这里只针对202.112.1.1  /  255.255.255.0这种格式,如果有很多行,需要自己调整和设计循环。
printf("%s\n",ip1);
printf("%s\n",ip2);
ip_num1 = inet_addr(ip1);
ip_num2 = inet_addr(ip2);
printf("%x\n",ip_num1);
printf("%x\n",ip_num2);
return 0;
}

第2个回答  2012-03-15
这个实际内容有点多,下面是简单的实现,VC编译通过,需要自己去完善。
编译需要添加Ws2_32.lib。
#include<stdio.h>
#include<stdlib.h>
#include<Winsock2.h>
int main()
{
char buff[128],ip1[16],ip2[16];
unsigned long ip_num1,ip_num2;
FILE *rd;
rd = fopen("ip.txt", "r");
if(rd != NULL)
{
fread(buff, 128, 1, rd);
printf("%s\n",buff);
}
else
{
printf("open error\n",buff);
}

sscanf(buff, "%s / %s", ip1, ip2);//这里只针对202.112.1.1 / 255.255.255.0这种格式,如果有很多行,需要自己调整和设计循环。
printf("%s\n",ip1);
printf("%s\n",ip2);

ip_num1 = inet_addr(ip1);
ip_num2 = inet_addr(ip2);
printf("%x\n",ip_num1);
printf("%x\n",ip_num2);
return 0;
}

ip.txt格式:
202.112.1.1 / 255.255.255.0追问

非常感谢呀,可是为什么我用C-free报错undefined reference to inet_addr@4呢?编译添加Ws2_32.lib,怎么添加呀?#pragma comment(lib, "ws2_32.lib")行吗?
谢谢了

追答

看这里:http://msdn.microsoft.com/en-us/library/ms738563(VS.85).aspx

追问

嗯,为什么我照你给的程序,编译就是不通过呢?

追答

应该是C-Free编译器的原因,你调试一下吧。我没有C-Free环境。

本回答被提问者采纳
第3个回答  2012-03-15
在控制面板下的cmd下可以吗?试试看追问

不行,要求用C语言实现

第4个回答  2012-03-15
好深奥
相似回答