2012-08-29 45 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'; 

}