
学C语言难得过老外学用中国的筷子吗?
上面的子程序有些小错误。下面的这个程序是经我调试过的,可以得到正确的结果。我考虑的只是压缩,把压缩输出来。并不把压缩后的结果保存到数组里面。不知题中是否要求保存结果到数组。程序如下:
#include<stdio.h>
main()
{char str[5]={'a','a','c','d','\0'};
int count=1;
int i=0,j=0;
char data;
int b;
while(str[i]!='\0')
{
count=1;
j=i+1;
while(str[j]!='\0'&&str[i]==str[j])
{
j++;
count++;
}
printf("%c",str[i]);
i=j;
if(count!=1)
printf("%d",count);
}
// Press(str);
}
输出结果为a2cd,符合题目要求。
[QUOTE]上面的子程序有些小错误。下面的这个程序是经我调试过的,可以得到正确的结果。我考虑的只是压缩,把压缩输出来。并不把压缩后的结果保存到数组里面。不知题中是否要求保存结果到数组。程序如下:
#include<stdio.h>
main()
{char str[5]={'a','a','c','d','\0'};
int count=1;
int i=0,j=0;
char data;
int b;
while(str[i]!='\0')
{
count=1;
j=i+1;
while(str[j]!='\0'&&str[i]==str[j])
{
j++;
count++;
}
printf("%c",str[i]);
i=j;
if(count!=1)
printf("%d",count);
}
// Press(str);
}
输出结果为a2cd,符合题目要求。
[/QUOTE]
我拿什么来解压啊?
/*
字符串压缩
------------------------------------------------------
src是待压缩的源字符串
压缩的结果由 dest 带回(dest 的内存空间需要由外部声明)
*/
void Compress(unsigned char* src, char* dest)
{
/*使用 s/d 的原因是函数调用完成后不至于修改了它们的值,因为它们是指针*/
char* s = src;
char* d = dest;
int T = 1; /* T 是重复字符的记数器 */
*d = *s; /* 初始化第一个字符 */
s++; /* 源字符串指针移一个字符,程序后面附带一个图可说明为什么先移动一位,我就不多说了 */
while (*s)
{
if (*d == *s) /*若相等*/
{
sprintf(d+1, "%d", ++T); /* 写入到数组流(字节序列) */
}
else
{
d += 2; /*遇到不相等的字符*/
*d = *s; /* 写入数组流的当前位置 */
T = 1; /* 重置记数器(为下一个有重复的字符串服务) */
}
s++; /*源字符串向后移动 */
}
}
上面那个不大行,只有这样形式的字符串才可以:aaaabbbbccdddd
下面这个是经过修改并测试的程序。
/*
字符串压缩
------------------------------------------------------
src是待压缩的源字符串
压缩的结果由 dest 带回(dest 的内存空间需要由外部声明)
*/
void Compress(unsigned char* src, char* dest)
{
/* 使用 s/d 的原因是函数调用完成后不至于修改了它们的值,因为它们是指针 */
char* s = src;
char* d = dest;
int T = 1; /* T 是重复字符的记数器 */
int Flag = 0; /* 标记临近是否存在重复的字符 */
*d = *s; /* 初始化 dest 的第一个字符 */
/* 补充 dest 为合法字符串,这是防止源字符串只有一个字符时(不进入循环)目的字符串能正确输出 */
*(d+1) = '\0';
while (*(++s))
{
if (*d == *s) /*若相等*/
{
sprintf(d+1, "%d", ++T); /* 写入到数组流(字节序列),位置是下一个字符的位置。 */
Flag = 1; /* 标记为存在重复字符 */
}
else
{
if (Flag) /* 若存在重复字符 */
d = dest + strlen(dest); /* 重新计算 d 指针位置 */
else
d++; /* 否则 d 向后移动 */
*d = *s; /* 取下一个字符 */
*(d+1) = '\0'; /* 补充 '\0',原因是原来的 '\0' 可能被覆盖掉 */
T = 1; /* 恢复下一个字符的记数器初始值 */
Flag = 0; /* 恢复重复标记为不存在,原因是还不知道是否存在 */
}
}
}
[此贴子已经被作者于2007-4-28 14:08:49编辑过]