#c #combinators
#c #комбинаторы
Вопрос:
#include <iostream>
#include <string.h>
using namespace std;
int sk00(char * a) //use to find length, in characters, of an expression
{
int b = 1, c = 0;
while(b != 0)
{
if (a[c] == '`'){b ;}
else{b--;}
c ;
}
return c;
}
void sk07(char * a)
{
int b = 0; while(a[b]!=0){b ;}b -= 2;
memcpy(a,a 3,b);
memcpy(a sk00(a),a sk00(a) sk00(a sk00(a)),b);
}
void sk20(char * z)
{
char * a = z 2;
int b = 0;while(a[b]!=0){b ;}b-=1;
memcpy(a,a 2,b);
int al = sk00(a), bl = sk00(a al), cl = sk00(a al bl);
b=b-(al bl cl);
memcpy(a al cl 1, a al, b cl bl);
}
int main()
{
char a[] = "``````s`k`sikabcd";
sk20(a 3);
cout << a << "; Final.n";
}
Вывод терминала:
pup@aurora-217:~/sk$ g sk5.c
pup@aurora-217:~/sk$ ./a.out
``````k`sikakakad; Final.
pup@aurora-217:~/sk$
Я ожидаю вывода в виде
`````k
sik'sikabcd
Комментарии:
1. я попытался взглянуть на код, но у меня немного закружилась голова после одной секунды пристального вглядывания в него
2. Вы пытались запустить свой код в отладчике? Какая строка работает не так, как вы ожидали?
3. Выбор идентификаторов, вероятно, не самый лучший, вы должны стремиться предоставлять идентификаторы лучше, чем
sk00
,sk07
илиsk20
. Определите, для чего предназначена каждая функция, и используйте имя, которое помогает ее понять. Также краткое описание того, что вы пытаетесь сделать, помогло бы другим понять код и предоставить полезные комментарии.4. @Rob, такие вещи, как это, вам нужно отлаживать самостоятельно и сводить к конкретному коду, по которому у вас есть вопрос, вместо того, чтобы позволить нам разобраться и отладить все это за вас.
5. Это всегда последняя строка sk20, которая не работает. И, честно говоря, я пытался разобраться в этом часами. Я предполагал, что memcpy может работать с перекрывающимися блоками.
Ответ №1:
Технически у вас возникает проблема в sk07, если и когда b больше 2 или 3, поскольку вы не можете использовать memcpy в случаях, когда исходное и целевое значения перекрываются. Вместо этого вы могли бы попробовать memmove.
Есть ли у нас здесь перекрытие, например
memcpy(a al cl 1, a al, b cl bl);
очень трудно сказать.
Ответ №2:
В случае потенциально перекрывающихся ячеек памяти, что, похоже, имеет место в вашем коде, вам следует использовать функцию memmove, а не подпрограмму memcpy. Процедура memcpy считается небезопасной для использования в случае перекрывающихся ячеек памяти и из-за оптимизации может привести к полному беспорядку результирующего вывода.
memmove принимает те же параметры в том же порядке, что и memcpy, и поэтому может использоваться просто как замена.