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

posted @ 2017-11-21 16:10  阿胜4K  阅读(934)  评论(0编辑  收藏  举报