关于“返回0”的错误消息“Thread1:signal SIGABRT”
问题描述:
我在C编程中编写了一个代码,尝试搜索字符串中的单词并将其替换为其他单词。 它运行时似乎都很好,但在“return 0”行发生错误并显示消息“线程1:信号SIGABRT”。关于“返回0”的错误消息“Thread1:signal SIGABRT”
我不知道问题出在哪里。有人有任何想法吗?
以下是我的代码:
int main(void){
char s1[]="ABCDABCD";
char *s2="BC";
char *s3="xyz";
int ReplaceStr(char *, char *, char *);
char *pps1=s1;
printf("%s\n", s1);
ReplaceStr(pps1, s2, s3);
printf("%s\n", s1);
return 0;
}
int ReplaceStr(char *pps1, char *ps2, char *ps3){
if(pps1==NULL || ps2==NULL || ps3==NULL) return 0;
int n1=strlen(pps1), n2=strlen(ps2), n3=strlen(ps3);
if(!n1 || !n2) return 0;
char *sNext=strstr(pps1, ps2);
char *sNext1=sNext+n2;
if(sNext==NULL) return 0;
int count=0;
char *Tmp=calloc(sizeof(char), strlen(sNext1)+1);;
if(sNext != NULL){
strcpy(Tmp, sNext1);
memcpy(sNext, ps3, n3);
strcpy(sNext+n3, Tmp);
sNext+=strlen(ps3);
count+=ReplaceStr(sNext, ps2, ps3)+1;
}
free(Tmp);
return count;
}
- S1:为是一个字符串搜索
- S2:这些话,我想看看
- S3:该单词,会取代S2
答
我现在还不确定您为什么声称错误在的末尾main
。你使用什么IDE /编译器?
尝试改写这样的代码:
int ReplaceStr(char*, char*, char*); // {1}
int main() {
char *s1="ABCDABCD"; // {2}
char *s2="BC";
char *s3="xyz";
char *pps1=s1;
printf("%s\n", s1);
ReplaceStr(pps1, s2, s3);
printf("%s\n", s1);
return 0;
}
int ReplaceStr(char *pps1, char *ps2, char *ps3){
if(pps1==NULL || ps2==NULL || ps3==NULL) return 0;
int n1=strlen(pps1), n2=strlen(ps2), n3=strlen(ps3);
if(!n1 || !n2) return 0;
char *sNext=strstr(pps1, ps2);
char *sNext1=sNext+n2;
if(sNext==NULL) return 0;
int count=0;
char *Tmp= (char*) calloc(sizeof(char), strlen(sNext1)+1); // {3}
if(sNext != NULL){
strcpy(Tmp, sNext1);
memcpy(sNext, ps3, n3);
strcpy(sNext+n3, Tmp);
sNext+=strlen(ps3);
count+=ReplaceStr(sNext, ps2, ps3)+1;
}
free(Tmp);
return count; }
在编辑{1},我宣布你是main
前使用该功能。
在编辑{2}处,为了保持一致性,我更改了s1[]=""
。它使我感到厌烦。
并且在编辑{3}处,calloc
返回一个void*
,因此您必须将其转换为所需的指针类型。
有了你的值,'s1'的结果是'AxyzDAxyzD'吗?那么你有一个问题,因为没有足够的内存分配给's1'来扩展它。 's1'的大小是9个字节,如果没有超出边界并且具有*未定义的行为*,你就不能写更多的东西。尝试用更大的尺寸声明它,例如'char s1 [32] =“ABCDABCD”;' –
@Someprogrammerdude它的工作。我认为问题就像你说的那样,新的s1将离开分配的内存。那么字符串不会自动扩展,除非我为它分配一个新的内存? –
C中的数组在编译时有一个大小设置。 C没有运行时可扩展字符串。如果您需要动态字符串,则必须在运行时自行管理其分配和重新分配。 –