我试图从数组中间删除一个元素,然后整理内容,我遇到了一些困难,因为我的测试数据不是“正确”。我通过使用strcpy用字符串填充数组来解决问题。 strcpy上面的注释部分是我之前使用的方法(不起作用)。有人可以解释一下,为什么它不起作用?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
char *array;
int i=5;
array = (char*)calloc(1024, sizeof(char));
if(array == NULL){
printf("Out of memory\n");
return 0;
}
//array = "Just some test string";
strcpy(array, "Just some test string");
printf("%s\n", array);
memmove(array+i+1, array+i, strlen(array)-i);
array[i] = ',';
printf("%s\n", array);
memmove(array+i, array+i+1, strlen(array)-i);
printf("%s\n", array);
free(array);
return 0;
}
printf通常在注释部分上工作,但memmove()会使我的程序崩溃!
答案 0 :(得分:1)
如果你有这个:
array = "Just some test string";
然后
1)由于覆盖了calloc
指针,您有memory leak。
2)您正在尝试修改字符串文字。这可能就是崩溃的原因。修改字符串文字是undefined behaviour。它们通常存储在只读存储器中。由于strcpy()
生成字符串文字的副本,因此它按预期工作,此方法失败。
答案 1 :(得分:0)
在这些陈述中
memmove(array+i+1, array+i, strlen(array)-i);
array[i] = ',';
尝试在','
位置插入字符5
,因为变量i
已初始化为5。
因此,包含终止零点的字符串部分必须从此位置开始向右移位。零件的长度是
strlen( array ) - i + 1
因为终止零也必须移动。
所以这些陈述看起来像
memmove( array + i + 1, array + i, strlen( array ) - i + 1 );
array[i] = ',';
然后在这些陈述中
memmove( array + i, array + i + 1, strlen( array ) - i );
这句话是对的。表达式strlen( array ) - i
的计算方式与
( strlen( array ) + 1 ) - ( i + 1 )
至于这句话
array = "Just some test string";
然后指针array
指向字符串文字,尽管C中的字符串文字具有非常量字符数组的类型,但它们是不可变的。
任何修改字符串文字的尝试都会导致程序的未定义行为。
此外,如果在此语句之前您还使用calloc调用的结果初始化此指针,则会出现内存泄漏,因为指针被重新分配并且已分配内存的地址丢失。
答案 2 :(得分:0)
我试着这样做。
我解决了这个问题:
*(array+strlen(string)+1)=0;
Null终止字符串,但如果后续的printf()工作正常,则无法提供帮助。
否则请参阅: http://www.java-samples.com/showtutorial.php?tutorialid=591