Странное поведение массива при декодировании кода по длине прогона - PullRequest
0 голосов
/ 03 декабря 2018

((ссылка на оригинальный вопрос в том случае, если вы знаете немецкий язык: https://stepik.org/lesson/193516/step/9?unit=167933)

Задача: printf ("falsche eingabe") всякий раз, когда во входных данных есть что-то ложное, если все верно, просто распечатайте декодированную версию)Также есть 2 режима (одиночный (abc) / мульти (aaa)), и когда есть изменение в режимах, вам также нужно напечатать "'" (режим запуска - одиночный режим.)

Пример ввода 1:

abcdefghijklmnopqrstuvwxyzabcdefghijkl

Пример вывода 1:

falsche eingabe

Пример ввода 2:

abcdefg

* 1017Выход 2:

abcdefg

Пример ввода 3:

'a2b3c2d2'efg

Пример вывода 3:

aabbbccddefg

Привет. Это моя домашняя работа, и мне уже удалось проделать это долгий путь, просто расшифровав ввод и подумав о каждом условии, при котором исходный ввод был неверным. Тогда я хорошо подумал ... Это не должнобыть лучшим способом сделать это. Поэтому я решил расшифроватькод и закодировать его снова, и если сохраненный ввод совпадает с моей закодированной версией, просто распечатайте декодированные данные, в противном случае ошибка.Проблема заключается в том, что всякий раз, когда я пытаюсь использовать входы 1- 'a2 2-ax

, декодирование работает неправильно.Я получаю результаты, как 1-аа * ||aaİ ||аа?||..... (аа + случайная метка) 2- топор + случайный знак

Когда я пробую ввод с той же логикой, но большей длины, программа работает просто отлично.

I 'Буду рад, если кто-то знает и покажет способ исправления декодирования.Я также не хочу решать эту проблему, просто добавив цикл 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 голосов
/ 03 декабря 2018

Я вижу 2 проблемы

1) вы звоните scanf неправильно

scanf("%s",&el);

должно быть

scanf("%s",el);

, потому что вы передаете егострока

2) вы не NUL завершаете свои строки.Это может привести к неопределенному поведению, так как код не будет знать, где заканчивается строка, и будет радостно заполнять ваши массивы.

Добавьте завершающий символ после ваших циклов, как показано ниже.Как только цикл завершится, k укажет на последнее значение.

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

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

Еще одна проблема, которую я только что заметил, заключается в том, что вы заполняете строки типа decoded странным образом, что усложняет задачу.чтобы NUL завершил их.

* * * * * * * * * * * * * * * * * * * * * * * * * * * 10 * * должен идти после того, как вы сохраните значение в массив, как показано ниже (и, очевидно, вы должны инициализировать его с * 10 22 *, а не -1).

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

Это означает, что когда вы закончили заполнять decoded, вы можете сделать decoded[y]='\0', чтобы завершить его, так как y будет указывать на конец, как k с saved цикл выше.

То же самое относится к encode и b

0 голосов
/ 03 декабря 2018

Спецификация гласит:

  • он начинается в одиночном режиме

  • , когда замечен ', он переключается между режимами

  • в мультимодусе за буквой (Zeichen) следует цифра (Ziffer, поэтому одна цифра), которая говорит, как часто должна быть буква (Zeichen)повторяется.(Таким образом, максимальный повтор равен 9.)

Просто реализуйте это, как указано, и все готово.

Пример:

abc'd2e4'ma'r2 --> abcddeeeemarr
...