下面的代码有什么问题

时间:2012-04-20 19:13:00

标签: c

该代码被假设为旋转i位置左侧的n个元素的一维向量。例如,当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;

3 个答案:

答案 0 :(得分:6)

更改

char* string = "abcdefghijk";

char string[] = "abcdefghijk"

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

答案 1 :(得分:4)

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

    char string[] = "abcdefghijk";

答案 2 :(得分:1)

将内存分配为变量初始值设定项,如下所示......

char* string = "abcdefghijk";

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

char *string = strdup("abcdefghijk");

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