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

关于“返回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
+0

有了你的值,'s1'的结果是'AxyzDAxyzD'吗?那么你有一个问题,因为没有足够的内存分配给's1'来扩展它。 's1'的大小是9个字节,如果没有超出边界并且具有*未定义的行为*,你就不能写更多的东西。尝试用更大的尺寸声明它,例如'char s1 [32] =“ABCDABCD”;' –

+0

@Someprogrammerdude它的工作。我认为问题就像你说的那样,新的s1将离开分配的内存。那么字符串不会自动扩展,除非我为它分配一个新的内存? –

+0

C中的数组在编译时有一个大小设置。 C没有运行时可扩展字符串。如果您需要动态字符串,则必须在运行时自行管理其分配和重新分配。 –

我现在还不确定您为什么声称错误在的末尾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*,因此您必须将其转换为所需的指针类型。