社区
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,这应该怎么写? 谢谢各位了啊
...全文
506
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写文章
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语言
对输入
字符串
进行
压缩
,例如将'aaabcccdde'
压缩
成'3ab3c2de'。通过双指针遍历,统计连续字符并将其数量与字符本身组合存储。虽然实现功能,但要注意
字符串
压缩
后可能存在的内存浪费问题。
C语言
--
压缩
字符串
这篇博客介绍了如何在
C语言
中使用原地算法
压缩
字符串
,确保
压缩
后长度小于或等于原数组长度,且数组元素保持为单个字符。文章通过示例详细说明了
压缩
过程。
C语言
编写
压缩
解压
字符串
程序
这篇博客详细介绍了如何使用
C语言
编写
字符串
压缩
和解压的程序。
压缩
过程通过遍历输入
字符串
,记录连续重复字符及其数量,形成新的数列。解压则根据
压缩
后的数列,奇数位取出字符,偶数位读取字符数量,重建原始
字符串
。文中给出了具体的代码实现。
C语言
70,038
社区成员
243,247
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章