这是什么意思,为RLE编写的C程序

what does that mean, C programm for RLE

本文关键字:程序 RLE 是什么 意思      更新时间:2023-10-16

我是C的新手,所以我不明白这一行发生了什么:

out[counter++] = recurring_count + '0';

+'0'是什么意思?

另外,你能帮我为大部分代码写注释吗?我不太懂,所以希望你能帮助我。谢谢你。

    #include "stdafx.h"
    #include "stdafx.h"
    #include<iostream>
    void encode(char mass[], char* out, int size)
    {
      int counter = 0;
      int recurring_count = 0;
      for (int i = 0; i < size - 1; i++)
      {
        if (mass[i] != mass[i + 1])
        {
          recurring_count++;
          out[counter++] = mass[i];
          out[counter++] = recurring_count + '0';
          recurring_count = 0;
        }
        else
        {
          recurring_count++;
        }
      }
    }
    int main()
    {
      char data[] = "yyyyyyttttt";
      int size = sizeof(data) / sizeof(data[0]);
      char * out = new char[size + 1]();
      encode(data, out, size);
      std::cout << out;
      delete[] out;
      std::cin.get();
      return 0;
    }

'0'的字符编码值添加到recurring_count的值中。如果我们假设ASCII编码字符,这意味着加48。

从范围0..的整数值中生成一个"可读"的数字是常见的做法。换句话说,将单个数字转换为字符形式的实际数字表示。只要所有数字都是"按顺序"的(只有0到9之间的数字),它就适用于任何编码,而不仅仅是ASCII -因此使用EBCDIC编码的计算机仍然具有相同的效果。

recurring_count + '0'是一种将int recurring_count值转换为ascii字符的简单方法。

你可以在维基百科上看到0的ascii字符码是48。将该值添加到该值的相应字符代码中。

你看,计算机可能并不真正认识字母、数字、符号;比如字母a,数字1,或者符号?。他们只知道0和1。不管是不是真的。存在与否

这里有一个位:1

这里还有一个:0

位只能是存在或不存在这两种情况。

但是计算机可以知道,比如说,5。如何?5只在10进制下是5;以4为底时,它是11,以2为底时,它是101。你不需要知道以4为基数,但我们来看看以2为基数的,以确保你知道它:

如果你只有0 s和1 s,你将如何表示0 ?0,对吧?您可能还会将1表示为1。那么2呢?嗯,如果可以的话,你会写2,但是你不能……所以你写成10

这与你在以10为基数从9前进到10时所做的完全类似。您不能将10写入单个数字中,因此您可以将最后一位数字重置为零,并将下一位数字增加1。同样的,当从1920时,你试图将9增加1,但你不能,因为10在10进制中没有个位数表示,所以你更愿意重置该数字,并增加下一个数字。

这就是用0 s和1 s来表示数字的方法。

现在你有了数字,你将如何表示字母、符号和字符数字,比如愚蠢的字符串L4M3中的4和3 ?你可以把它们映射出来;对它们进行映射,例如,从那时起,数字1将代表字符A,然后2将代表字符B

当然,这会有点问题;因为当你这样做的时候,数字1将同时代表数字1和字符A。这就是为什么如果你写……

printf( "%d %c", 65, 65 );

您将得到输出"65 A",前提是您所在的环境使用ASCII编码,因为在ASCII中,65在被解释为字符时被映射为表示A。完整的列表可以在上找到

简而言之

带单引号的'A'传递的信息是,"嘿,这里的A将接收A的代表性整数值",在大多数环境中,它将只是65'0'也是一样,它的计算结果为48,使用ASCII编码。