如何在C中实现RLE

6l7fqoea  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(117)

我最近试着用C编写RLE,我已经重写了5次,所有的时候它只是说“”或者只是null。这是我的最新版本,有谁能帮我吗?

#include <stdio.h>
#include <string.h>
char rle(char src[]) {
    char chr = src[0], res = "";
    int count = 0, len = strlen(src), tmp = 0;
    for (int i; i < len; i++) {
        while (chr == src[i]) {
            count++, i++;

        }
        chr = src[i];
        tmp = i;
    }
    res+=src[tmp] + snprintf(NULL,0,"%d",count);
    return res;
}

int main(int argc, char *argv[]) {
    printf("%s", rle("aaaaa"));
}

尝试比较当前角色和下一个角色,不起作用。

vhipe2zx

vhipe2zx1#

char是 * 字符类型 *,而不是 * 字符串类型 *。char表示单个字符-一个字节的信息。
string实际上是指向字节序列的第一个字符的指针,总是以零字节结束。最常见的类型为 pointer-to-charchar *)或 array-of-charchar [])。
字符串需要 space - memory; a buffer.您必须以某种方式分配此内存-自动分配的数组,动态内存块(必须手动调整大小),静态池等。
C中的字符串不能与+运算符组合。您必须使用像strcat这样的字符串函数、像sprintf这样的字符串I/O函数,或者手动操作字符串中的各个字节。
snprintf返回int,而不是字符串。此值表示写入缓冲区的字节数,或在发生截断时 * 本应写入 * 的字节数,或在发生错误时为-1
这里是RLE的基本实现,但你可能想拿起你的C textbook,重新阅读有关类型和字符串的章节。

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

static int rle(char *dest, size_t length, const char *src)
{
    size_t bytes = 0;

    while (*src) {
        size_t remaining = length - bytes;
        size_t sp = strspn(src, (char []) { *src, 0 });
        int rc = snprintf(dest + bytes, remaining, "%zu%c", sp, *src);

        if (-1 == rc || rc >= remaining)
            return -1;

        bytes += rc;
        src += sp;
    }

    dest[bytes] = 0;

    return 0;
}

int main(void)
{
    char source[] = "aaaaabbbbcccaab";
    char result[64] = { 0 };

    if (0 == rle(result, sizeof result, source))
        puts(result);
    else
        fputs("Result failed (I/O error or buffer too small)\n", stderr);
}
5a4b3c2a1b

相关问题