九度题目1475:IP数据包解析

/*这个题让我收获很多,1.关于字符串的处理问题 2.输入输出重定向问题 3.最重要的一个,关于gets() 回车吃掉的问题!!4.关于IHL的考虑还有认真思考童鞋的建议=====*/ 

#include <iostream>
#include <cstdio>
#include <cstring> 
using namespace std; 
int num(char c){
if(c>='0'&&c<='9'){
return c-'0';
}else{
return c-'a'+10;
}
}
int main(int argc, char *argv[]) {

int n,c=1;
while(cin>>n){
c=1;
char str[1000];
gets(str);//在输入的时候会敲回车,但是cin遇到回车就停止输入,也就是说回车没有被输入,
//仍然停留在buffer中。于是,在遇到gets的时候,程序一开始就遇到回车,也就是字符串输入结束,
//从而str的内容为一个回车  。加上gets,程序会将残留的回车吃掉,于是后面那个gets的时候,buffer为空,让用户输入。 
while(n--){
gets(str);
int offset=num(str[1])*4*3; 
cout<<"Case #"<<c++<<endl;
cout<<"Total length = "<<num(str[6])*256*16+num(str[7])*256+num(str[9])*16+num(str[10])<<" bytes"<<endl;
cout<<"Source = "<<num(str[36])*16+num(str[37])<<"."<<num(str[39])*16+num(str[40])<<"."<<num(str[42])*16+num(str[43])<<"."<<num(str[45])*16+num(str[46])<<endl;                                               
cout<<"Destination = "<<num(str[48])*16+num(str[49])<<"."<<num(str[51])*16+num(str[52])<<"."<<num(str[54])*16+num(str[55])<<"."<<num(str[57])*16+num(str[58])<<endl;
cout<<"Source Port = "<<num(str[offset])*16*256+num(str[offset+1])*256+num(str[offset+3])*16+num(str[offset+4])<<endl;
cout<<"Destination Port = "<<num(str[offset+6])*16*256+num(str[offset+7])*256+num(str[offset+9])*16+num(str[offset+10])<<endl<<endl;
}
}


return 0;
}


//FILE *fin = fopen("E://in.txt","r");
/*while(fgets(str,199,fin)){
cout<<"Case #"<<c++;
cout<<"Total length = "<<num(str[6])*256*16+num(str[7])*256+num(str[9])*16+num(str[10])<<" bytes"<<endl;
cout<<"Source = "<<num(str[36])*16+num(str[37])<<"."<<num(str[39])*16+num(str[40])<<"."<<num(str[42])*16+num(str[43])<<"."<<num(str[45])*16+num(str[46])<<endl;                                               
cout<<"Destination = "<<num(str[48])*16+num(str[49])<<"."<<num(str[51])*16+num(str[52])<<"."<<num(str[54])*16+num(str[55])<<"."<<num(str[57])*16+num(str[58])<<endl;
cout<<"Source Port = "<<num(str[60])*16*256+num(str[61])*256+num(str[63])*16+num(str[64])<<endl;
cout<<"Destination Port = "<<num(str[66])*16*256+num(str[67])*256+num(str[69])*16+num(str[70])<<endl;

fclose(fin);*/




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值