游程长度代码解码中数组的奇怪行为

时间:2018-12-03 15:39:55

标签: c arrays run-length-encoding

(((如果您知道德语,请链接到原始问题:https://stepik.org/lesson/193516/step/9?unit=167933

任务:printf(“ falsche eingabe”)只要输入中有错误,如果一切正确,则只需打印解码后的版本即可。还有2种模式(单(abc)/多(aaa)),每当模式发生变化时,您还需要打印“”(起始模式为单模式。)

样本输入1:

abcdefghijklmnopqrstuvwxyzabcdefghijkl

示例输出1:

falsche eingabe

样本输入2:

abcdefg

示例输出2:

abcdefg

样本输入3:

'a2b3c2d2'efg

示例输出3:

aabbbccddefg

嗨。这是我的作业,我已经成功地做到了这一点,只需解码输入并考虑原始输入错误的每种情况即可。然后我想好..这不应该是最好的方法。因此,我决定对代码进行解码,然后再次对其进行编码,如果保存的输入与我的编码版本匹配,则只需打印解码后的数据,否则将出错。 问题是,每当我尝试输入时 1-'a2 2-斧头

解码不正确。我得到类似的结果 1-aa * || aaİ||啊? || .....(aa +随机标记) 2-斧头+随机符号

当我尝试使用相同的逻辑但长度更长的输入时,程序运行正常。

如果有人知道并显示一种解决解码的方法,我将感到非常高兴。我也不想仅仅通过在可能的情况下最后添加一个for循环来解决这个问题。

谢谢你

#include <stdio.h>

int main()
{
    char el[50];
    scanf("%s", &el); // 'a2b2c3'dfh
    char saved[50]; // 'a2b2c3'dfh
    char decoded[50]; //aabbcccdfh

    int k, h, y = -1, b = -1; //

    int multi = 0; //(while decoding) 1 -> multi , 0 -> not
    char encoded[50]; // 'a2b2c3'dfh
    int multi2 = 0; //(while encoding)

    for (k = 0; el[k] != '\0'; k++) { //saving

        saved[k] = el[k]; // 'a2b2c3'dfh
    }

    for (k = 0; el[k] != '\0'; k++) { //decoding

        if (el[k] == 39) {
            continue;
        }

        if (50 <= el[k + 1] && el[k + 1] <= 57) { // 2->9
            if (multi == 0)
                multi = 1;
        }

        if (multi == 0) {
            y++;
            decoded[y] = el[k];
        }

        else { //multi ==1 //a2
            for (h = 0; h < (int)el[k + 1] - 48; h++) {

                y++;
                decoded[y] = el[k];
                multi = 0;
            }

            k++;
        }

    } // decoded = aabbcccdfh ( hier ist k = laenge )

    if (k > 30) {
        printf("falsche eingabe");
        return 0;
    }

    for (k = 0; k < y + 1; k++) {
        if (decoded[k] == decoded[k + 1]) {

            if (multi2 == 0) {
                multi2 = 1;
                b++;
                encoded[b] = 39;
            }
        }

        if (multi2 == 0) {
            b++;
            encoded[b] = decoded[k];
        }
        else {
            b++;
            encoded[b] = decoded[k];
            // 0 -> decoded[k], 1 -> for, 2-> '

            for (h = k; decoded[h] == decoded[h + 1]; h++)
                ;

            b++;
            encoded[b] = ((h - k + 48) + 1);

            k = h;

            if (decoded[k + 1] != decoded[k + 2]) {
                multi2 = 0;
                b++;
                encoded[b] = 39;
            }
        }
    }

    //wurde die erste eingabe richtig codiert ? ( also gibt es fehler oder nicht ? )

    for (k = 0; saved[k] != '\0'; k++) {
        if (saved[k] != encoded[k]) {
            printf("falsche eingabe\n");
            return 0;
        }
    }
    printf("%s", decoded);
}

我试图使它尽可能清晰,对不起,如果它可以更加清晰。

2 个答案:

答案 0 :(得分:0)

规范说:

  • 以单一方式开始

  • 看到'时,它会在模式之间切换

  • 在多种用法中,字母(Zeichen)后跟一个数字(Ziffer,因此是一个单个数字),该数字表示字母(Zeichen)必须重复的频率。 (因此,最大重复次数是9。)

只需按照指定的方式执行此操作即可。

示例:

abc'd2e4'ma'r2 --> abcddeeeemarr

答案 1 :(得分:0)

我可以看到2个问题

1)您打错了scanf

scanf("%s",&el);

应该是

scanf("%s",el);

因为您要传递一个字符串

2)您不可以终止字符串。这可能会导致未定义的行为,因为代码将不知道字符串的结尾,并且很可能会使数组溢出。

在如下所示的循环之后添加终止字符。循环完成后,k将指向最后一个值。

for (k = 0; el[k] != '\0'; k++) { //saving

    saved[k] = el[k]; // 'a2b2c3'dfh
}
saved[k] = '\0';

我刚刚发现的另一个问题是,您以奇怪的方式填充了decoded之类的字符串,这使得NUL很难终止它们。

在将值存储到如下所示的数组中之后,y++应该走了(显然,您应该使用0而不是-1对其进行初始化)。

        decoded[y] = el[k];
        y++;

这意味着当您完成填充decoded时,您可以执行decoded[y]='\0'终止它,因为y会指向末尾,就像ksaved以上循环。

encodeb相同