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

即一个IP存入一个unsigedlong中,文档202.112.1.1/255.255.255.0202.112.1.2/255.255.255.0202.112.2.1... 即一个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
展开
 我来答
百度网友b0e28cae4
2012-03-15 · TA获得超过4016个赞
知道大有可为答主
回答量:1275
采纳率:85%
帮助的人:591万
展开全部
#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
(字符串)

*/
tattackor
2015-09-18 · TA获得超过3.5万个赞
知道大有可为答主
回答量:5083
采纳率:94%
帮助的人:854万
展开全部

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;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
折咏志0hfd5a
2012-03-15 · TA获得超过279个赞
知道小有建树答主
回答量:182
采纳率:0%
帮助的人:241万
展开全部
这个实际内容有点多,下面是简单的实现,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")行吗?
谢谢了
追答
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
12深沉12
2012-03-15 · TA获得超过223个赞
知道小有建树答主
回答量:268
采纳率:0%
帮助的人:93.5万
展开全部
在控制面板下的cmd下可以吗?试试看
追问
不行,要求用C语言实现
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
澹台大壮
2012-03-15 · TA获得超过259个赞
知道答主
回答量:211
采纳率:0%
帮助的人:91.8万
展开全部
好深奥
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式