单点时限: 2.0 sec
内存限制: 256 MB
问题描述
超文本传输协议 (HTTP) 是互联网上应用最为广泛的一种网络协议,所有的宽WW文件都在网络中明文传输。
HTTPS是以安全为目标的HTTP通道,即,HTTP下加入SS L层对HTTP传输的文件进行加密。
小明同学认为所有的HTTP链接都是不完美的,他想把所有的HTTP链接都挑选出来,进行排序整理,但是由于历史记录非常多,这对于小明同学来说是一个巨大的挑战。
聪明的你能够帮助他一下吗?
输入格式
第1行:输入一个正整数n,表示输入的网址链接个数,其中,1≤n≤100;
第2~n+1行:每行输入一个网址链接 (长度不超过300个字符)。网址链接的格式为:协议://域名/虚拟地址
例如:http://acm.ecnu.edu.cn/contest/81/problem/B/,其中域名为:acm.ecnu.edu.cn,虚拟地址为:/contest/81/problem/B/。
输出格式
把HTTP协议的网络链接按照域名升序排列输出,域名相同的按照虚拟地址升序排序。
样例:
input:
6
http://acm.ecnu.edu.cn/contest/81/problem/B/
http://acm.ecnu.edu.cn/contest/81/problem/A/
http://acm.ecnu.edu.cn/contest/81/problem/E/
https://acm.ecnu.edu.cn/contest/81/problem/C/
https://acm.ecnu.edu.cn/contest/81/problem/D/
http://acm.ecnu.edu.cn/contest/81/problem/C/
output:
http://acm.ecnu.edu.cn/contest/81/problem/A/
http://acm.ecnu.edu.cn/contest/81/problem/B/
http://acm.ecnu.edu.cn/contest/81/problem/C/
http://acm.ecnu.edu.cn/contest/81/problem/E/
问题分析:
使用的函数要注意:
1、strncmp(a,b,n)b的n个单元复制到a中,要注意末尾自己要添加'\0'
2、strcmp(a,b)不需要末尾添加’\0’
代码解决部分:
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
typedef long long int lli;
typedef struct
{
char agreement[6],name[300],virtualname[300];
}http;
void handle(http* a,char* s)
{
int i=0;
while(s[i]!=':')
{
i++;
}
strncpy(a->agreement,s,i);
a->agreement[i]='\0';
s+=i+3;
int j=0;
while(s[j]!='/')
{
j++;
}
strncpy(a->name,s,j);
s+=j+1;
a->name[j]='\0';
strcpy(a->virtualname,s);
}
int cmp(const void* a,const void *b)
{
http* x=(http*)a;
http* y=(http*)b;
if(strcmp(x->name,y->name)!=0) return strcmp(x->name,y->name)<0?-1:1;
else return strcmp(x->virtualname,y->virtualname)<0?-1:1;
}
int equal(http a,http b)
{
if(strcmp(b.agreement,"https")==0) return 0;
else
{
if(strcmp(a.name,b.name)==0&&strcmp(a.virtualname,b.virtualname)==0)
return 0;
}
return 1;
}
void print(http* a,int n)
{
http tmp={"1","1","1"};
for(int i=0;i<n;i++)
{
// printf("%d",equal(tmp,a[i]));
if(equal(tmp,a[i])!=0)
{
printf("%s://%s/%s\n",a[i].agreement,a[i].name,a[i].virtualname);
tmp=a[i];
}
else continue;
}
}
int main()
{
int n;
char* s=(char *)malloc(sizeof(char)*301);
scanf("%d",&n);
http a[n];
for(int i=0;i<n;i++)
{
scanf("%s",s);
handle(a+i,s);
// printf("!!%s!!%s!!%s\n",a[i].agreement,a[i].name,a[i].virtualname);
}
qsort(a,n,sizeof(a[0]),cmp);
print(a,n);
return 0;
}