用C语言实现写一个函数,其功能是对一个字符串的内容进行压缩,压缩的规则是:如果该字符是第一次和第二次出现的字母(区分大小写),则保留;否则,则删去(标点符号、空格等非字去)。通过函数返回压缩结果。在主函数中输入一个不长于50的字符串,调用上述函数进行压缩,并输出结果。
时间: 2024-05-16 18:15:55 浏览: 97
以下是实现该功能的C语言代码:
```c
#include <stdio.h>
#include <string.h>
#include <ctype.h>
char* compress(char* str);
int main() {
char str[51];
printf("请输入不长于50的字符串:");
fgets(str, 51, stdin);
str[strcspn(str, "\n")] = '\0'; // 去除fgets读入的换行符
char* result = compress(str);
printf("压缩结果为:%s\n", result);
return 0;
}
char* compress(char* str) {
int count[26] = {0}; // 记录每个字母出现次数
int first[26] = {0}; // 记录每个字母第一次出现的位置
int i, j, len = strlen(str);
char c;
for (i = 0; i < len; i++) {
c = str[i];
if (isalpha(c)) { // 只处理字母
c = toupper(c); // 不区分大小写
if (count[c-'A'] == 0) { // 第一次出现
first[c-'A'] = i;
}
count[c-'A']++;
}
}
for (i = len-1; i >= 0; i--) { // 从后往前遍历字符串
c = str[i];
if (isalpha(c)) {
c = toupper(c);
if (count[c-'A'] == 1 || (count[c-'A'] == 2 && first[c-'A'] == i)) {
continue; // 保留该字母
}
} else if (!isspace(c) && !ispunct(c)) { // 非字母、空格和标点符号不处理
continue;
}
// 删除该字符
for (j = i; j < len-1; j++) {
str[j] = str[j+1];
}
len--;
}
return str;
}
```
该函数首先用两个数组记录每个字母出现的次数和第一次出现的位置,然后从后往前遍历字符串,根据规则保留或删除每个字符。最后返回修改后的字符串。
阅读全文