-2
#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$ 

次の行に沿った出力を期待しています

`````ksik`sikabcd

4

2 に答える 2

1

技術的には、ソースとターゲットが重複する場合に memcpy を使用できないため、b が 2 または 3 より大きい場合、sk07 で問題が発生します。代わりに memmove を試すことができます。

たとえば、ここに重複があるかどうか

memcpy(a+al+cl+1, a+al, b+cl+bl); 

を伝えるのは非常に難しいです。

于 2011-05-04T06:40:55.917 に答える
1

オーバーラップする可能性のあるメモリ位置の場合は、コードの場合のように、memcpy ルーチンではなく memmove 関数を使用する必要があります。memcpy ルーチンは、メモリ位置が重複している場合に使用するのは安全ではないと考えられており、最適化により結果の出力が完全に混乱する可能性があります。

memmove は memcpy と同じパラメーターを同じ順序で受け取るため、ドロップイン置換として使用できます。

于 2011-05-04T06:49:09.543 に答える