“返回0”上的错误消息“Thread1:signal SIGABRT”

时间:2016-10-28 08:31:14

标签: c multithreading return sigabrt

我在C编程中编写了一个代码,试图在字符串中搜索单词并用其他单词替换这些单词。 当它运行时一切似乎都很好,但是在“返回0”行发生错误,并显示消息“线程1:信号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的单词

1 个答案:

答案 0 :(得分:0)

目前我不确定您为什么会在return 0末尾的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*,因此您必须将其转换为所需的指针类型。