你有一个通讯录,你想通过号码来搜索联系人,但是你可能只记得某个人号码的一个片段,现在给你一个通讯录列表和一个号码片段,你需要输出所有号码里面有这个号码片段的联系人的姓名。
输入格式
第 1 行为一个整数T(1≤T≤15)为问题数。
每个问题按如下格式进行输入:
第一行是一个整数n,表示通讯录里面有n个联系人(n < 10000),接下来的n行,每行是一个姓名(长度不超过30,只包含小写英文字母)和一个手机号码(长度不超过11),姓名和手机号码中间有一个空格隔开。最后一行是一个号码片段(长度不超过11)。
输出格式
对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0: 等),然后第一行先输出一个整数表示符合条件的联系人个数,接下来每行输出一个联系人(空格隔开姓名和号码),请按姓名的字典序递增顺序输出所有满足条件的姓名和号码, 如果两个联系人姓名相同则按号码的字典序递增输出。
感想
strcpy(s1,s2)这两个要求都是字符串,所以开始直接拷贝person的思路不行
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct imformation
{
char name[31];
char number[12];
}person;
int cmp(const void*a,const void*b)
{
person m=*((person*)a);
person n=*((person*)b);
if(strcmp(m.name,n.name)==0)
{
return strcmp(m.number,n.number);
}
else
return strcmp(m.name,n.name);
}
int main()
{
int num;
scanf("%d",&num);
for(int i=0;i<num;i++)
{
int x,a;
person first[10000];
scanf("%d",&a);
for(int i=0;i<a;i++)
scanf("%s%s",first[i].name,first[i].number);
char compare[12];
scanf("%s",compare);
person final[10000];
int len=0;
for(int i=0;i<a;i++)
{
if(strstr(first[i].number,compare))
{strcpy(final[len].name,first[i].name);
strcpy(final[len].number,first[i].number);
len++;
}
}
qsort(final,len,sizeof(person),cmp);
printf("case #%d:\n",i);
printf("%d\n",len);
for(int i=0;i<len;i++)
printf("%s %s\n",final[i].name,final[i].number);
}
}