社区
C语言
帖子详情
用C语言压缩字符串
powerv1987
2010-02-01 12:44:53
问题是这样的,首先用C语言打开一个txt文件(这个文件里有一串0101这样的代码,可能有几个代码串,用空格或者回车分开),然后检测到连续N个(N>6)1或者0的时候,输出+N+(N个1)或者-N-(N个0),其他的字符不变,例如 000000010101(空格)1111111110000111 就输出 -7-10101(空格)+9+0000111到一个output.txt,这应该怎么写? 谢谢各位了啊
...全文
440
5
打赏
收藏
用C语言压缩字符串
问题是这样的,首先用C语言打开一个txt文件(这个文件里有一串0101这样的代码,可能有几个代码串,用空格或者回车分开),然后检测到连续N个(N>6)1或者0的时候,输出+N+(N个1)或者-N-(N个0),其他的字符不变,例如 000000010101(空格)1111111110000111 就输出 -7-10101(空格)+9+0000111到一个output.txt,这应该怎么写? 谢谢各位了啊
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
toborac
2010-02-01
打赏
举报
回复
这个代码没处理连续的空格或回车,要处理的话,把2楼if(N_cur > 6) {这句话改成
if((N_cur > 6) && ((*p_cur == '1') || (*p_cur == '0')) {
就可以了
toborac
2010-02-01
打赏
举报
回复
全部程序如下,为了省事就分配两个大buffer了,做的细一点可以一段一段的处理:
#include <stdio.h>
#include <stdlib.h>
/* 把上面2楼挪过来 */
int pack_str( char *in_str, char *out_str)
{
...
}
int main(int argc, char **argv)
{
char filename[128];
char *in, *out;
int file_len, out_len, i;
FILE *fp;
printf("Please enter file name: ");
scanf("%s", filename);
fp = fopen(filename, "rb");
if(fp == NULL) {
printf("Can't open file %s\n", filename);
exit(1);
}
fseek(fp, 0L, SEEK_END);
file_len = ftell(fp);
fseek(fp, 0L, SEEK_SET);
in = malloc(file_len+1);
if(in == NULL) {
printf("Can't allocate input buffer\n");
exit(2);
}
out = malloc(file_len+1);
if(out == NULL) {
printf("Can't allocate output buffer\n");
exit(3);
}
fread(in, 1, file_len, fp);
in[file_len] = '\0';
out_len = pack_str(in, out);
printf("Output is:\n");
for(i=0; i<out_len; i++) {
printf("%c", out[i]);
}
printf("\n");
return 0;
}
shellfish567
2010-02-01
打赏
举报
回复
你这个该4位一压缩,按16进制
toborac
2010-02-01
打赏
举报
回复
/*
* in_str: input raw string
* out_str: output packed string
* return: output string length
* 调用者负责读入文件 把读取的源字符串作为in_str,并负责输出字符串out_str的分配和释放
* 为节省内存,建议调用者扫描空格或回车分隔符,一段一段来调用
*/
int pack_str( char *in_str, char *out_str)
{
int in_len = strlen(in_str);
int out_len = 0;
char *p_in = in_str, *p_out = out_str;
char *p_cur = NULL;
int i, N_cur = 0;
while(1) {
if(*p_in != '\0') {
if(p_cur == NULL) {
p_cur = p_in;
N_cur = 1;
p_in++;
continue;
}
if(*p_in == *p_cur) {
N_cur++;
p_in++;
continue;
}
}
if(N_cur > 6) {
if(*p_cur == '1') {
*p_out++ = '+';
*p_out++ = '0' + N_cur;
*p_out++ = '+';
} else {
*p_out++ = '-';
*p_out++ = '0' + N_cur;
*p_out++ = '-';
}
out_len += 3;
} else {
for(i=0; i<N_cur; i++) {
*p_out++ = *p_cur;
}
out_len += N_cur;
}
p_cur = p_in;
N_cur = 1;
if(*p_in != '\0') {
break;
}
return out_len;
}
guoyu_bo
2010-02-01
打赏
举报
回复
设置个计数器来统计个数
大于6了就转到压缩模式
C语言
字符串
快速
压缩
算法代码
主要介绍了
C语言
字符串
快速
压缩
算法代码,将
字符串
中连续出席的重复字母进行
压缩
,其主要的
压缩
字段的格式为”字符重复的次数+字符”。有需要的小伙伴参考下吧。
C语言
中
压缩
字符串
的简单算法小结
主要介绍了
C语言
中可用于实现
字符串
压缩
的简单算法小结,列举了包括哈夫曼算法等三个核心的程序实现算法,需要的朋友可以参考下
C语言
–
压缩
字符串
压缩
字符串
给定一组字符,使用原地算法将其
压缩
。
压缩
后的长度必须始终小于或等于原数组长度。 数组的每个元素应该是长度为1 的字符(不是 int 整数类型)。 在完成原地修改输入数组后,返回数组的新长度。 示例1: 输入:[a,a,b,b,c,c,c] 输出:返回6,输入数组的前6个字符应该是:[a,2,b,2,c,3] 说明: aa被a2替代。bb被b2替代。ccc被c3替代。 示例2: 输入:[a] 输出:返回1,输入数组的前1个字符应该是:[a] 说明: 没有任何
字符串
被替代。 示例3: 输入:[a
哈夫曼
压缩
解压算法-
C语言
C语言
实现的huffman
压缩
解
压缩
算法
c语言
字符串
数组和特殊矩阵.ppt
c语言
字符串
数组和特殊矩阵.ppt
C语言
70,023
社区成员
243,263
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章