题意:
就是模拟一个查字典的过程,先输入互相对应的英语和外国语作为参照,再输入一些外国语,要求输出对应的英语
要点:
1.结构体的字符串排序
struct Node
{
int data;
char str[100];
}s[100];
//按照结构体中字符串str的字典序排序
int Comp(const void*p1, const void*p2)
{
return strcmp((*(Node*)p1).str, (*(Node*)p2).str);
}
2.输入两个字符串通过判断空行停止比较复杂,需要用到一个sscanf函数:
通过sscanf(str,"%s%s",a,b)可以比较好的判断空行,中间的是规定格式,也就是说必须输入两个字符串分别赋给a,b,第一次输入str赋给了a,但其实还没完成sscanf,再一次输入str后输入了第二个字符串赋给了b。从而可以利用str判断空行。
sscanf函数可以从一个字符串中提取数字,小写字符等等,非常好用
参考的博客:点击打开链接
百度百科:点击打开链接
15089067 | Seasonal | 2503 | Accepted | 19748K | 641MS | C++ | 863B | 2016-01-21 10:54:30 |
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define maxn 100050
struct node
{
char eng[100];
char fore[100];
}a[maxn];
int cmp(const void *x, const void *y) //结构体字典序快排
{
return strcmp((*(node *)x).fore, (*(node *)y).fore);
}
int main()
{
char b[maxn];
int num=0;
char str[100];
while(gets_s(str))
{
if (str[0] == '\0')
break;
sscanf(str, "%s%s", a[num].eng, a[num].fore);//sscanf函数可以将str按照规定格式一个个赋给后面的值
num++; //比如第一次读入str赋给eng,需要再读入一个str赋给fore
}
qsort(a, num, sizeof(a[0]), cmp);
while (gets_s(str)) //利用strcmp比较字典序二分,不用管最后怎么停止,题目里没说不用管
{
int left = 0;
int right = num;
bool flag = false;
while (left <= right)
{
int mid = (left + right) / 2;
if (strcmp(a[mid].fore, str) == 0)
{
printf("%s\n", a[mid].eng);
flag = true;
break;
}
else if (strcmp(a[mid].fore, str) < 0)
{
left = mid + 1;
}
else
{
right = mid - 1;
}
}
if (!flag)
printf("eh\n");
}
return 0;
}