用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);
}
你可以用一个简单的循环遍历输入的字符串,同时记录每个字符及其连续出现的次数。如果压缩后的字符串长度没有变短,就返回原来的字符串。以下是一个实现这个功能的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
来存放压缩后的字符串,如果待压缩字符串较长,请根据需要调整数组大小; - 考虑到最后一位的特殊判断,所以不需要在循环结束后再判断一次压缩后的字符串长度,直接返回即可。