Вопросы memcpy; копирование неправильного блока и несколько раз
#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
2 ответа
Технически у вас есть проблема в sk07, если и когда b больше 2 или 3, так как вы не можете использовать memcpy для случаев, когда источник и цель перекрываются. Вы могли бы попробовать memmove вместо этого.
Есть ли у нас здесь совпадение, например
memcpy(a+al+cl+1, a+al, b+cl+bl);
очень сложно сказать.
В случае потенциально перекрывающихся областей памяти, как это выглядит в вашем коде, вы должны использовать функцию memmove, а не подпрограмму memcpy. Подпрограмма memcpy считается небезопасной для использования в случае перекрывающихся областей памяти и из-за оптимизаций может привести к полному беспорядку полученного результата.
memmove принимает те же параметры в том же порядке, что и memcpy, и поэтому может использоваться просто как замена.