0

我正在尝试制作一个反转部分字符串的顺序的函数。我是使用指针的新手,出于某种原因,我可以访问字符串字符的位置以复制出子字符串,但我无法将它们放回同一位置...

当我尝试将反转的子字符串复制回其原始位置时,我得到

程序收到信号 SIGSEGV,分段错误。0x00007ffff7b5dc66 在?? () 来自 /lib/x86_64-linux-gnu/libc.so.6

任何帮助都是极好的!

这是我到目前为止所拥有的:

void reverse(char* line, int start, int end){

      char str[end-start];

      memcpy ( str , line + start , end-start );

      reverseSubString ( str );

      memcpy ( line + start, str , end-start );

}

void reverseSubString(char* str){

    int i, j, len;
    char temp;

    i=j=len=temp=0;

    len=strlen(str);

    for (i=0, j=len-1; i<=j; i++, j--)
    {
        temp=str[i];
        str[i]=str[j];
        str[j]=temp;
    }
}
4

2 回答 2

3
  char str[end-start];

  memcpy ( str , line + start , end-start );

除非包含原始字符串的 0 终止符,否则您有一个char不是 0 终止的数组。所以

len=strlen(str);

计算谁知道如果那还没有崩溃。然后

for (i=0, j=len-1; i<=j; i++, j--)
{
    temp=str[i];
    str[i]=str[j];
    str[j]=temp;
}

访问分配的内存之外。

于 2013-02-26T22:47:28.270 回答
1

reverseSubstring()需要一个以 NUL 结尾的 C 字符串,因为它调用strlen()传入的字符串。但是,您无法在reverse函数中以 NUL 结尾您的字符串。要么这样做,甚至更好,传入一个length参数:

void reverseSubString(char *str, size_t len)
{
    int i, j;
    char temp;

    for (i = 0, j = len - 1; i <= j; i++, j--) {
        temp = str[i];
        str[i] = str[j];
        str[j] = temp;
    }
}

void reverse(char *line, int start, int end)
{
    char str[end - start];
    memcpy(str, line + start, end - start);
    reverseSubString(str, end - start);
    memcpy (line + start, str, end - start);
}
于 2013-02-26T22:47:32.150 回答