簡體   English   中英

游程長度代碼解碼中數組的奇怪行為

[英]Strange Behaviour of an Array in a run-length code decoding

((如果您知道德語, 鏈接到原始問題: https ://stepik.org/lesson/193516/step/9?unit = 167933)

任務:printf(“ falsche eingabe”)只要輸入中有錯誤,如果一切正確,則只需打印解碼后的版本即可。 還有2種模式(單(abc)/多(aaa)),每當模式發生變化時,您還需要打印“'”(開始模式是單模式。)

樣本輸入1:

abcdefghijklmnopqrstuvwxyzabcdefghijkl

樣本輸出1:

法爾什·埃因加貝

樣本輸入2:

ABCDEFG

樣本輸出2:

ABCDEFG

樣本輸入3:

“a2b3c2d2'efg

樣本輸出3:

aabbbccddefg

你好。 這是我的作業,我已經成功地做到了這一點,只需解碼輸入並考慮原始輸入錯誤的每種情況即可。 然后我想好..這不應該是最好的方法。 因此,我決定對代碼進行解碼,然后再次對其進行編碼,如果保存的輸入與我的編碼版本匹配,則只需打印解碼后的數據,否則將出錯。 問題是,每當我嘗試輸入1-'a2 2-軸

解碼不正確。 我得到類似1-aa * ||的結果 aaİ|| AA? || .....(aa +一個隨機標記)2- ax +一個隨機符號

當我嘗試使用相同的邏輯但長度更長的輸入時,編程工作正常。

如果有人知道並顯示一種解決解碼的方法,我將感到非常高興。 我也不想僅通過在可能的情況下最后添加一個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);
}

我試圖使它盡可能清晰,如果它可以更加清晰,我很抱歉。

規格說明:

  • 它以單一方式開始

  • 當看到'時,它將在模式之間切換

  • 在多種形式中,字母(Zeichen)后跟一個數字(Ziffer,所以是一個數字),表示必須重復字母(Zeichen)的頻率。 (因此最大重復次數為9。)

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

例:

abc'd2e4'ma'r2 --> abcddeeeemarr

我可以看到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指向末尾,就像k與上面saved循環一樣。

encodeb

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM