2011-05-04 112 views
-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"; 
} 

端子输出:memcpy问题;复制错误块和多次

[email protected]:~/sk$ g++ sk5.c 
[email protected]:~/sk$ ./a.out 
``````k`sikakakad; Final. 
[email protected]:~/sk$ 

我期待沿着

`````ksik`sikabcd

+1

我试着看看代码,但是在深深地盯着它后,我感到有点头晕 – lurscher 2011-05-04 06:32:47

+0

您是否试图在调试器中运行代码?哪一行不符合你的预期? – 2011-05-04 06:33:45

+0

标识符的选择可能不是最好的,您应该旨在提供比'sk00','sk07'或'sk20'更好的标识符。确定每个功能的意图,并使用有助于理解它的名称。同时简要描述您正在尝试做什么将有助于他人理解代码并提供有用的评论。 – 2011-05-04 07:11:36

回答

1

技术上的线路输出你有SK07一个问题,如果当b大于2或3,因为在源和目标重叠的情况下不能使用memcpy。你可以尝试一下memmove。

无论我们在这里重叠,例如

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

是非常难以判断。

1

在可能重叠的内存位置的情况下,您的代码中应该使用memmove函数,而不是memcpy例程。在重叠内存位置的情况下,memcpy例程被认为是不安全的,并且由于优化会导致输出结果的完整混乱。

memmove按照与memcpy相同的顺序采用相同的参数,因此可以用作替换的下拉列表。