• 1052. 卖个萌 (20)


    原题: https://www.patest.cn/contests/pat-b-practise/1052

    思路: 本题最大的问题在于怎么把表情符号存起来, 也就是怎么读数据的
    问题, 按照题目描述, 输入可能不是ASCII字符. 问题就出在这里, 首先
    我们也想一下, 题目说了表情符号最大是4个非空字符, 如果我们用char
    数组来存放, 声明一个空间为5的大小肯定是不够的, 假设按照UTF-8编码
    逻辑处理, 那么一个表情符号最大可能需要3位, 一共最大就需要12位, 再
    加上末尾的, 就要13位. 而事实上我看过别人的代码, 就算声明空间
    为5大小, 也能AC, 不知道这是怎么回事.

    还有一个小问题, 题目虽然说了符号最多为10个, 但是题目没说用户输入就
    一定在[1, 10]这个范围, 但貌似测试用例也没测试这个.

    所以我个人认为这题用来当考试题, 真是非常失败. 但本题让我学到一个重要
    知识点, 就是scanf这个函数原来还可以用正则表达式来匹配, 这简直就是
    个神器. 比如我们需要某个读取一行字符串, 空格也读取, 回车表示结束.
    直接scanf("%[^ ]", 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()) != '
    ') {
            if (ch == '[') {
                scanf("%[^]]", handStr[++hlen]);
            }
        }
        // 获取眼表情
        while ((ch = getchar()) != '
    ') {
            if (ch == '[') {
                scanf("%[^]]", eyeStr[++elen]);
            }
        }
        // 获取口表情
        while ((ch = getchar()) != '
    ') {
            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("
    ");
            } else {
                printf("Are you kidding me? @\/@
    ");
            }
        }
        
        return 0;
    }
    
    

    参考:
    http://www.jianshu.com/p/9e4ccd9cc0e3
    https://www.cnblogs.com/linzhehuang/p/6554506.html

  • 相关阅读:
    剑桥雅思写作高分范文ESSAY50
    剑桥雅思写作高分范文ESSAY49
    剑桥雅思写作高分范文ESSAY48
    剑桥雅思写作高分范文ESSAY47
    剑桥雅思写作高分范文ESSAY46
    剑桥雅思写作高分范文ESSAY45
    剑桥雅思写作高分范文ESSAY44
    剑桥雅思写作高分范文ESSAY43
    剑桥雅思写作高分范文ESSAY42
    剑桥雅思写作高分范文ESSAY41
  • 原文地址:https://www.cnblogs.com/asheng2016/p/7873687.html
Copyright © 2020-2023  润新知