“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'。如果找到了,则对找到的位置进行处理:
- 首先,通过遍历连续的字符 '6' 来确定 '6' 的连续出现次数。
- 如果连续出现次数大于 3 且小于等于 9,则将这些字符 '6' 替换为 '9'。
- 如果连续出现次数大于 9,则将前面的连续 9 个字符 '6' 替换为 "27"。
- 将替换后的剩余部分拼接到替换位置的后面。
- 继续查找字符串中是否还存在连续出现的字符 '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; }