该代码被假设为旋转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;
答案 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()
,然后将源字符串复制到目标中。您已经#include
了string.h
,因此strdup()
函数原型已经可用,无需任何其他代码。