проблемы с memcpy; копирование неправильного блока и несколько раз

#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, и поэтому может использоваться просто как замена.