[英]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
循環一樣。
encode
和b
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.