我正在尝试创建一个反转字符串部分顺序的函数。我是新手使用指针,由于某种原因,我可以访问我的字符串的字符位置来复制一个子字符串,但我不能把它们放回到相同的位置......
当我尝试将反转的子串复制回原来的位置时,我得到了
编程接收信号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;
}
}
答案 0 :(得分: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;
}
在分配的内存之外访问。
答案 1 :(得分:1)
reverseSubstring()
期望NUL终止的C字符串,因为它在传入的字符串上调用strlen()
。但是,您无法在reverse
函数中终止字符串。要么这样做,要么更好,传递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);
}