2

该代码假设将一个由 n 个元素组成的一维向量旋转到 i 位置。例如,当 n=8 和 i = 3 时,向量 abcdefgh 旋转为 defghabc。

以下在 string_reverse 函数处崩溃。无法找出那里出了什么问题。

#include <stdio.h>
#include <string.h>
#include < conio.h>

void string_reverse(char* str, int left, int right )
{
    char *p1 = str + left;
    char *p2 = str + right;

    while (p1 < p2) 
    {
        char temp = *p1;
        *p1 = *p2;
        *p2 = temp;
        p1++;
        p2--;
    }
}


void rotate( char* str, int k )
{
    int n = strlen( str );
    string_reverse( str, 0, k - 1 );
    string_reverse( str, k, n - 1 );
    string_reverse( str, 0, n -1 );
}


int main(int argc, char* argv[])
{
    char* string = "abcdefghijk";

    rotate( string, 3 );    
    printf("%s",string );   
    getch();
    return 0;
}



it crashes at 

*p1 = *p2;
4

3 回答 3

6

改变

char* string = "abcdefghijk";

char string[] = "abcdefghijk"

前者指向只读字符串文字,而后者是从该文字初始化的数组。

于 2012-04-20T19:23:30.413 回答
4

如果要使用字符串进行操作,请使用真正的字符数组而不是字符指针。

    char string[] = "abcdefghijk";
于 2012-04-20T19:21:39.040 回答
1

作为变量初始化器分配的内存,像这样......

char* string = "abcdefghijk";

...是不可变的。也就是说,您无法更改它,并且尝试写入它会导致段错误。您只能修改通过malloc()和朋友分配的内存。您可以使用这样的静态字符串轻松完成此操作:

char *string = strdup("abcdefghijk");

strdup()函数malloc()在内部调用,然后将源字符串复制到目标中。您已经#include-ingstring.h了,因此strdup()函数原型已经可用,无需任何额外代码。

于 2012-04-20T19:17:35.110 回答