L1-058 6翻了

“666”是一种网络用语,大概是表示某人很厉害、我们很佩服的意思。最近又衍生出另一个数字“9”,意思是“6翻了”,实在太厉害的意思。如果你以为这就是厉害的最高境界,那就错啦 —— 目前的最高境界是数字“27”,因为这是 3 个 “9”!

本题就请你编写程序,将那些过时的、只会用一连串“6666……6”表达仰慕的句子,翻译成最新的高级表达。

输入格式:

输入在一行中给出一句话,即一个非空字符串,由不超过 1000 个英文字母、数字和空格组成,以回车结束。

输出格式:

从左到右扫描输入的句子:如果句子中有超过 3 个连续的 6,则将这串连续的 6 替换成 9;但如果有超过 9 个连续的 6,则将这串连续的 6 替换成 27。其他内容不受影响,原样输出。

输入样例:

it is so 666 really 6666 what else can I say 6666666666

输出样例:

it is so 666 really 9 what else can I say 27

 对于处理字符串的问题,学会使用标准库里的函数会让我们事半功倍

1.char * strstr(char *a,char *b):在字符串中查找第一次出现字符串b的位置,如果没有返回null

2.strcat(char *a,char *b):将字符串b追加在字符串a之后,可以粗略理解为字符串的“加法”;

3.在 C 语言中,字符串实际上是使用空字符 \0 结尾的一维字符数组。因此,\0 是用于标记字符串的结束。

这段代码的主要思路是使用 strstr 函数来查找字符串中是否存在连续出现的字符 '6666'。如果找到了,则对找到的位置进行处理:

  1. 首先,通过遍历连续的字符 '6' 来确定 '6' 的连续出现次数。
  2. 如果连续出现次数大于 3 且小于等于 9,则将这些字符 '6' 替换为 '9'。
  3. 如果连续出现次数大于 9,则将前面的连续 9 个字符 '6' 替换为 "27"。
  4. 将替换后的剩余部分拼接到替换位置的后面。
  5. 继续查找字符串中是否还存在连续出现的字符 '6666',直到找不到为止。
    #include <stdio.h>
    #include <string.h>
     
    int main() {
        char str[1001];
        gets(str); // 输入字符串
        
        char *p = strstr(str, "6666"); // 在输入的字符串中查找是否包含 "6666",返回第一个出现的位置
        
        char *q; // 辅助指针
        int count; // 记录连续出现的 '6' 的次数
        
        while (p) { // 当找到了 "6666",继续循环
            count = 0; // 初始化计数器
            q = p; // q 指向当前找到的 "6666" 的位置
            while (*q == '6') { // 统计连续出现的 '6' 的个数
                count++;
                q++;
            }
            if (count > 3 && count <= 9) { // 如果连续出现次数在 4 到 9 之间
                *p = '9'; // 将当前位置的 '6' 替换为 '9'
                p++; // 移动到下一个字符
                *p = '\0'; // 将当前位置之后的字符全部置为空,相当于删除了连续出现的 '6'
                strcat(str, q); // 将删除后的字符串拼接在当前位置之后
            }
            if (count > 9) { // 如果连续出现次数大于 9
                *p = '2'; // 将当前位置的 '6' 替换为 '2'
                p++; // 移动到下一个字符
                *p = '7'; // 将当前位置的 '6' 替换为 '7'
                p++; // 移动到下一个字符
                *p = '\0'; // 将当前位置之后的字符全部置为空
                strcat(str, q); // 将删除后的字符串拼接在当前位置之后
            }
            p = strstr(str, "6666"); // 继续查找下一个 "6666"
        }
        puts(str); // 输出修改后的字符串
        return 0;
    }
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值