c语言之字符串压缩程序

用c语言表达字符串的压缩,不用指针表达,利用字符串重复出现的次数,编写一种方法,实现基本的字符串压缩功能,比如aabbcc变为a2b2c2,若压缩后的字符串长度未变短,则返回原来的字符串,字符串中只包含大小写字母
怎么写

#include <stdio.h>
 
int main()
{
    int arr[26] = { 0 };
    char s[100];
    scanf("%s", s);
    for (int i = 0; s[i]; i++)
    {
        arr[s[i] - 'a']++;
    }
    for (int i = 0; i < 26; i++)
    {
        if (arr[i])
            printf("%c%d", (char)(i + 'a'), arr[i]);
    }
    return(0);
}

img

你可以用一个简单的循环遍历输入的字符串,同时记录每个字符及其连续出现的次数。如果压缩后的字符串长度没有变短,就返回原来的字符串。以下是一个实现这个功能的C语言函数:

#include <stdio.h>
#include <string.h>

#define MAX_SIZE 1000

void compressString(char* str) {
    int n = strlen(str);
    int i, j, count;
    char temp[MAX_SIZE];
    int index = 0;

    for (i = 0; i < n; i++) {
        count = 1;
        while (i + count < n && str[i] == str[i + count]) {
            count++;
        }

        // 如果压缩后的字符串长度没有变短,返回原字符串
        if (count + 1 >= n - i) {
            printf("Compression not possible. Original string: %s\n", str);
            return;
        }

        // 将压缩后的字符串写入temp中
        temp[index++] = str[i];
        temp[index++] = count + '0';
    }

    temp[index] = '\0';
    printf("Compressed string: %s\n", temp);
}

int main() {
    char str[MAX_SIZE];
    printf("Enter a string: ");
    scanf("%s", str);
    compressString(str);
    return 0;
}

这个程序首先读取用户输入的字符串,然后调用compressString函数进行压缩。在这个函数中,我们遍历输入的字符串,对每个字符,我们计算它连续出现的次数。如果压缩后的字符串长度没有变短,我们就返回原字符串。否则,我们将压缩后的字符串写入temp数组中,最后输出压缩后的字符串。

【以下回答由 GPT 生成】

问题分析:
编写字符串压缩程序,要实现以下功能:
1. 统计字符串中连续出现的字母及其出现次数;
2. 根据统计结果生成压缩后的字符串;
3. 判断压缩后的字符串长度是否比原字符串短,若不短则返回原字符串。

解决方案:
1. 遍历字符串,统计连续出现的字母及其出现次数;
2. 若出现次数大于等于2,则将字母和出现次数拼接成字符串添加到压缩后的字符串中;
3. 若出现次数等于1,则只将字母添加到压缩后的字符串中;
4. 最后判断压缩后的字符串长度是否比原字符串短,若不短则返回原字符串。

代码示例:
```c
#include <stdio.h>
#include <string.h>

#define MAX_LENGTH 1000

char* compressString(char* str) {
    int len = strlen(str);
    char compressed[MAX_LENGTH] = "";
    int index = 0;

    for (int i = 0; i < len; i++) {
        int count = 1;
        while (str[i] == str[i+1]) {
            count++;
            i++;
        }

        compressed[index++] = str[i];
        if (count > 1) {
            char countStr[10];
            snprintf(countStr, 10, "%d", count);
            strcat(compressed, countStr);
            index += strlen(countStr);
        }
    }

    if (strlen(compressed) >= len) {
        return str;
    } else {
        return compressed;
    }
}

int main() {
    char str[MAX_LENGTH];
    printf("请输入字符串: ");
    scanf("%s", str);

    char* compressedStr = compressString(str);
    printf("压缩后的字符串是: %s\n", compressedStr);

    return 0;
}

注意事项: - 代码中使用了一个较大的数组compressed来存放压缩后的字符串,如果待压缩字符串较长,请根据需要调整数组大小; - 考虑到最后一位的特殊判断,所以不需要在循环结束后再判断一次压缩后的字符串长度,直接返回即可。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^