2012-08-29 43 views
1

我基本上编码我自己的字符串函数C.用自己的strcat函数C错误

我一直在尝试使用指针做strcat功能似乎并不能明白我是否应该分配内存使用malloc或将它留给堆。

char *my_strcat(const char *s1, const char *s2) 
{ 


    const unsigned char *p1 = (const unsigned char *)s1; 
    const unsigned char *p2 = (const unsigned char *)s2; 

    unsigned char *string; 
     //string = malloc(strlen(s1) + strlen(s2) + 1); 
    while (*p1 != '\0') 
{ 
     *string = *p1; 
     string++; 
     p1++; 

     if(*p1 == '\0') 
     { 
      while(*p2 != '\0') 
      { 
       *string = *p2; 
       string++; 
       p2++; 
      } 
     } 
    } 
    return (char *)string; 
} 

任何关于更有效地执行此任务的提示或我做错的事情都会很棒!

干杯

编辑

行,所以我得到了一个有效的解决方案,但只是想后,我用malloc我应该在哪里免费()呢?

char *my_strcat(const char *s1, const char *s2) 
{ 


    const unsigned char *p1 = (const unsigned char *)s1; 
    const unsigned char *p2 = (const unsigned char *)s2; 

    char *string = malloc(sizeof(char *)); 
    char *res = string; 

    while (*p1 != '\0') 
{ 
     *string = *p1; 
     string++; 
     p1++; 
    } 
    while (*p2 != '\0') 
    { 
     *string = *p2; 
     string++; 
     p2++; 
} 
    *string = '\0'; 

    return (char *)res; 
} 
+1

你会更好地执行strncat ... strcat()是应用程序中堆栈溢出漏洞的主要来源。 –

+2

如何从strcat()中获得堆栈溢出?缓冲区溢出我明白,但是...... – mimicocotopus

+0

'string'需要指向'p2'的末尾。 PS不初始化'字符串'不会“把它留给堆”。 – oldrinb

回答

3

首先,我假设分配被错误地注释掉了。

  • 您需要保存您分配的指针并将其返回。否则,你要返回一个指针string,它指向连接结果的结尾
  • 你没有终止结果字符串;您需要添加*string = '\0'
  • 你应该在第二循环移动到第一环的外侧,并丢弃它周围的if条件:如果第一循环已经结束,你知道*p1\0

char *string = malloc(strlen(s1) + strlen(s2) + 1); 
char *res = string; 
for (; *p1 ; *string++ = *p1++); 
for (; *p2 ; *string++ = *p2++); 
*string = '\0'; 
return res; 
+5

标准的'strcat()'函数没有内存分配。 –

+0

另外:malloc可以返回NULL,因此检查它可能是一个好主意。如果你得到'char * string = malloc ...'行的警告,那么显式转换为'(char *)'会使它消失。 –

+0

@Nathan http://stackoverflow.com/questions/953112/should-i-explicitly-cast-mallocs-return-value http:// stackoverflow。com/questions/605845/do-i-cast-the-result-of-malloc –

2

strcat没有分配任何内存,所以如果你试图完成同样的事情,那么你不需要使用malloc。

char* strcat(char* destination,char* source) { 
int c = 0; 
int sc; 

while(destination[c] != 0) { c++; } 

for(sc = 0;sc < strlen(source);sc++) { 
    destination[sc+c] = source[sc]; 
} 

destination[sc+c] = 0; 

return destination; 

} 
0

这对我有用。

char* my_strcat(char* a,char* b) 
{ 
     int i,j; 

     for(i=0;a[i];i++); 
     for(j=0;b[j];j++,i++) 
     a[i]=b[j]; 
     a[i]='\0'; 

}