1052. 卖个萌 (20)
原题: https://www.patest.cn/contests/pat-b-practise/1052
思路: 本题最大的问题在于怎么把表情符号存起来, 也就是怎么读数据的
问题, 按照题目描述, 输入可能不是ASCII字符. 问题就出在这里, 首先
我们也想一下, 题目说了表情符号最大是4个非空字符, 如果我们用char
数组来存放, 声明一个空间为5的大小肯定是不够的, 假设按照UTF-8编码
逻辑处理, 那么一个表情符号最大可能需要3位, 一共最大就需要12位, 再
加上末尾的\0
, 就要13位. 而事实上我看过别人的代码, 就算声明空间
为5大小, 也能AC, 不知道这是怎么回事.
还有一个小问题, 题目虽然说了符号最多为10个, 但是题目没说用户输入就
一定在[1, 10]这个范围, 但貌似测试用例也没测试这个.
所以我个人认为这题用来当考试题, 真是非常失败. 但本题让我学到一个重要
知识点, 就是scanf
这个函数原来还可以用正则表达式来匹配, 这简直就是
个神器. 比如我们需要某个读取一行字符串, 空格也读取, 回车表示结束.
直接scanf("%[^\n]", str)
这就搞定了.
下面的代码充分利用scanf这个特性, 非常简单的就获取到了表情符号.
实现:
#include <stdio.h>
#define L1 20
#define L2 20
/* 下面的代码把数组一律人为设置从1开始, 数组长度就表示最后一个元素 */
int main (void) {
char handStr[L1][L2];
int hlen = 0; // 实际长度
char eyeStr[L1][L2];
int elen = 0;
char mouthStr[L1][L2];
int mlen = 0;
int i;
int ch;
// 获取手表情
while ((ch = getchar()) != '\n') {
if (ch == '[') {
scanf("%[^]]", handStr[++hlen]);
}
}
// 获取眼表情
while ((ch = getchar()) != '\n') {
if (ch == '[') {
scanf("%[^]]", eyeStr[++elen]);
}
}
// 获取口表情
while ((ch = getchar()) != '\n') {
if (ch == '[') {
scanf("%[^]]", mouthStr[++mlen]);
}
}
int n; // 需要输出的表情个数
int icon[6]; // 存储每个表情序号
scanf("%d", &n);
for (i = 1; i <= n; i++) {
scanf(
"%d %d %d %d %d",
&icon[1], &icon[2], &icon[3], &icon[4], &icon[5]
);
// 如果输入的序号不在1和最大序号之间, 判错
if (
icon[1] >= 1 && icon[1] <= hlen &&
icon[2] >= 1 && icon[2] <= elen &&
icon[3] >= 1 && icon[3] <= mlen &&
icon[4] >= 1 && icon[4] <= elen &&
icon[5] >= 1 && icon[5] <= hlen
) {
printf("%s", handStr[icon[1]]); // 左手
printf("(");
printf("%s", eyeStr[icon[2]]); // 左眼
printf("%s", mouthStr[icon[3]]); // 口
printf("%s", eyeStr[icon[4]]); // 右眼
printf(")");
printf("%s", handStr[icon[5]]); // 右手
printf("\n");
} else {
printf("Are you kidding me? @\\/@\n");
}
}
return 0;
}
参考:
http://www.jianshu.com/p/9e4ccd9cc0e3
https://www.cnblogs.com/linzhehuang/p/6554506.html