编写一个java程序: 是关于RLE decode 比如说:sdf^5t经过程序后就会成为sdfttttt 符号是" ^ " 谢谢

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编写一个java程序: 是关于RLE decode 比如说:sdf^5t经过程序后就会成为sdfttttt 符号是" ^ " 谢谢相关的知识,希望对你有一定的参考价值。

参考技术A 我的想法是这样的,将字符串拆分,判断是否等于^,并且紧接着的是否为数字。为数字,就将数字后的非数字循环打印,最后将所有字符串接起来。不知道对不对哦 参考技术B public String decode(String str)
char[] charArray = str.toCharArray();
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < charArray.length; i++)
if(charArray[i]=='^'&&i<charArray.length-2&&Character.isDigit(charArray[i+1]))
int j = 0;
while (j<Integer.parseInt(String.valueOf(charArray[i+1])))
buffer.append(charArray[i+2]);
j++;

i+=2;
else
buffer.append(charArray[i]);


return buffer.toString();


我自己测试过了,望采纳本回答被提问者采纳

C中的RunLength解码[重复]

【中文标题】C中的RunLength解码[重复]【英文标题】:RunLength Decoding in C [duplicate] 【发布时间】:2015-05-26 15:35:20 【问题描述】:

这是我的运行长度解码程序。但是将输出作为垃圾值提供。 char *decode_rle(char *a,int length) 方法中的输出是正确的,但是当它返回到主函数时它是错误的。

#include<stdio.h>
#include<string.h>

char *decode_rle(char *a,int length)

    char op[50];
    int i,j,k=0,count=0;
    for(i=0;i<length;i++)
    
        if( a[i]=='a' || a[i]=='b' || a[i]=='c' || a[i]=='d' || a[i]=='e' || a[i]=='f' || a[i]=='g')
        
            count = a[i+1] - '0';
            for(j=0;j<count;j++)
            
                op[k]=a[i];
                k++;
            
        
    
    op[k] = '\0';
printf("\n the decoded string is %s\n",op);
    return op;

int main()

    int i=0,j,length,count;
    char a[20],*output;
    printf("\n Enter a string ");
    gets(a);
    printf("\n The string you entered is %s",a);
    length = strlen(a);
    printf("\n length is %d\n",length);
    output = decode_rle(a,length);
    i=0;
    while(output[i]!='\0')
    
        printf("%c",output[i]);
        i++;
   
    getch();
    return 0;

【问题讨论】:

另外,将gets 替换为fgets 【参考方案1】:

问题是你返回了一个指向函数 decode_rle 的局部变量的指针,一旦你从该函数返回,它就不再存在了。

首先,我建议您将 op 声明为 main 的局部变量,并将一个额外的参数传递给 decode_rle。

char *decode_rle(char *a,int 长度, char *op) …… 主函数() ... 字符运算[50]; ... 输出 = decode_rle(a,length, op);

这会起作用,但是...如果您需要它来完成有限的概念证明之外的其他一些问题。

您对 a 和 p 使用固定长度,如果用户在 get 中输入的字符串长度超过 20,会发生什么情况?如果解码后的字符串大于 50 怎么办? (记住 c 不做数组边界检查,如果你写在你不拥有的内存上会发生什么?)

你如何处理二进制 0 ? (请记住,c 中的字符串是使用 asciiz 约定存储的,如果您尝试压缩/解压缩的数据本身包含二进制 0 会发生什么?您将如何更改缓冲区的定义以处理这种情况?)

李>

【讨论】:

【参考方案2】:

您正试图返回一个范围仅为函数decode_rle 的变量。你不能那样做并且安全。当您退出函数时,数组 op 及其内容不再正式可供您的程序访问

你应该编译警告-Wall(你可以添加-Werror来激励你一点)。

【讨论】:

【参考方案3】:

您返回一个指向op 的指针,它是decode_rle() 中的一个局部变量。当函数返回时,该局部变量超出范围,其内存将被重用,因此指向该内存的指针不是很有用。

相反,您可以使用malloc() 分配所需的内存并返回一个指向它的指针,或者向decode_rle() 添加一个附加参数,在其中将一个指针传递给应该写入结果的内存。

【讨论】:

以上是关于编写一个java程序: 是关于RLE decode 比如说:sdf^5t经过程序后就会成为sdfttttt 符号是" ^ " 谢谢的主要内容,如果未能解决你的问题,请参考以下文章

6.3RLE算法的缺点

西电C语言程序设计实验之RLE解压缩算法

西电C语言程序设计实验之RLE解压缩算法

西电C语言程序设计实验之RLE解压缩算法

《程序是怎样跑起来的》第六章

压缩算法实现,LZW和RLE用法测试