(((如果您知道德语,请链接到原始问题: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);
}
我试图使它尽可能清晰,对不起,如果它可以更加清晰。
答案 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
会指向末尾,就像k
对saved
以上循环。
encode
和b
相同