萌萌哒表情符号通常由“手”、“眼”、“口”三个主要部分组成。简单起见,我们假设一个表情符号是按下列格式输出的:
[左手]([左眼][口][右眼])[右手]
现给出可选用的符号集合,请你按用户的要求输出表情。
输入格式:
输入首先在前三行顺序对应给出手、眼、口的可选符号集。每个符号括在一对方括号 []
内。题目保证每个集合都至少有一个符号,并不超过 10 个符号;每个符号包含 1 到 4 个非空字符。
之后一行给出一个正整数 K,为用户请求的个数。随后 K 行,每行给出一个用户的符号选择,顺序为左手、左眼、口、右眼、右手——这里只给出符号在相应集合中的序号(从 1 开始),数字间以空格分隔。
输出格式:
对每个用户请求,在一行中输出生成的表情。若用户选择的序号不存在,则输出 Are you kidding me? @\/@
。
输入样例:
[╮][╭][o][~\][/~] [<][>]
[╯][╰][^][-][=][>][<][@][⊙]
[Д][▽][_][ε][^] ...
4
1 1 2 2 2
6 8 1 5 5
3 3 4 3 3
2 10 3 9 3
输出样例:
╮(╯▽╰)╭
<(@Д=)/~
o(^ε^)o
Are you kidding me? @\/@
思路:题目本身不难,难的是数据的输入,一个表情字符并不一定是一个字节存储,所以必须用字符串;这时可以用正则表达式
%[^]; sscanf(w,"%[^]]",s)表示把字符串w中的']'之前的字符传给s;
#include <iostream>
#include <stdio.h>
#include <string.h>
const int N=11;
const int M=6;
int scanf_Emoticon(char s[][M]);//输入表情函数
int main( )
{
//表情每一部分用一个字符串数组存储
char hands[N][M];//手
char eyes[N][M];//眼睛
char mouth[N][M];//嘴
int n,a,b,c,d,e;
int h_len=scanf_Emoticon(hands);//输入表情,同时返回表情个数
int e_len=scanf_Emoticon(eyes);
int m_len=scanf_Emoticon(mouth);
scanf("%d",&n);
while(n--)
{
scanf("%d%d%d%d%d",&a,&b,&c,&d,&e);
if(a<=h_len&&b<=e_len&&c<=m_len&&d<=e_len&&e<=h_len)//序号必须符合范围
{ if(a>0&&b>0&&c>0&&d>0&&e>0)
{
printf("%s(%s%s%s)%s\n",hands[a],eyes[b],mouth[c],eyes[d],hands[e]);
continue;
}
}
printf("Are you kidding me? @\\/@\n");//注意\必须\\
}
return 0;
}
int scanf_Emoticon(char s[][M])
{
char c='\0';
int len=0;
while(c!='\n')
{
c=getchar();
if(c=='[')
{
scanf("%[^]]",s[++len]);//正则表达式,
//%[^],%[^]]表示把']'之前的字符存入s中
}
}
return len;
}
方法二:直接接收整行字符,需要哪个表情再通过表情解析函数去提取
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int solve(char *s,int n);//解析表情函数 ,n表示求第n个表情
const int N=128;
int main( )
{
char str[3][N];//分别存储手,眼睛,嘴 表情
int len[3]={0};//分别记录手,眼睛,嘴 表情长度
int i,j,n,a,b,c,d,e;
for(i=0;i<3;i++)
{
//读入整行字符,包括回车,str:存储字符,N:空间大小,stdin:输入流
fgets(str[i],N,stdin);
for(j=0;str[i][j]!='\n';j++)
{
if(str[i][j]=='[')
len[i]++;//统计长度
}
}
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d%d%d%d%d",&a,&b,&c,&d,&e);
if(a<=len[0]&&b<=len[1]&&c<=len[2]&&d<=len[1]&&e<=len[0])
{
if(a>0&&b>0&&c>0&&d>0&&e>0)//序号符合范围
{
solve(str[0],a);
printf("(");
solve(str[1],b);
solve(str[2],c);
solve(str[1],d);
printf(")");
solve(str[0],e);
printf("\n");
continue;//退出本次循环
}
}
printf("Are you kidding me? @\\/@\n");
}
return 0;
}
int solve(char *s,int n)
{
int i,j=0;
char str[16];
memset(str, '\0', sizeof(str));//初始化
for(i=0;s[i]!='\n';i++)
{
if(s[i]=='[')
{
j++;
if(j==n)//去第n个表情
{
sscanf(s+i+1,"%[^]]",str);//s+i+1表示地址偏移
printf("%s",str);//输出取到的字符
}
}
}
return 0;
}