用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 打赏 收藏 转发到动态 举报
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了就转到压缩模式

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧