2012-04-20 64 views
-1

有人能告訴我什麼是錯誤的以下?將字符添加到字符數組C++

我想添加字符到一個字符數組。 name是指向MyString類中的字符數組的指針。

void MyString::add_chars(char* c) 
{ 
     if(l < strlen(c)+strlen(name)) 
       name = resize(name, l, sizeof(c)); 
     int i,j; 
     for(i=0; i<strlen(c); i++) { 
       name[i+l-1] = c[i]; 
       l++; 
     } 
} 

char* MyString::resize(char* vptr, int currentsize, int extra) { 
     char* temp = new char[currentsize + extra]; 
     int i; 
     for (i = 0; i < currentsize; i++) { 
       temp[i] = vptr[i]; 
     } 
     vptr = temp; 
     return vptr; 
} 

而且在主:

MyString g ("and"); 
g.add_chars("baasdf"); 
cout << g.get_name() << "\n"; 

但GET_NAME返回 「和b」。我如何修復我的代碼?

編輯: 更新代碼,還是同樣的結果..

void StringList::add_chars(char* c) 
{ 
     char* my_new_string = resize(name, l, sizeof(char)); 
     if(my_new_string != NULL) 
     { 
       delete [] name; 
       name = my_new_string; 
     } 
     int i,j; 
     for(i=0; i<strlen(c); i++) { 
       name[i+l-1] = c[i]; 
       l++; 
     } 
     name[l-1] = '\0'; 
} 

char* StringList::resize(char* vptr, int currentsize, int extra) { 
     char* temp = new char[currentsize + extra + 1]; 
     int i; 
     for (i = 0; i < currentsize; i++) { 
       temp[i] = vptr[i]; 
     } 
     vptr = temp; 
     return vptr; 
} 
+4

哇,這是很多錯誤。您是否嘗試在調試器中逐步瀏覽並觀察變量和參數?這是調試的第一步。不問我們。 – 2012-04-20 18:33:24

回答

0

首先,我是對的假設,這是在學習「如何創建自己的字符串類」一個學習的你? C++已經有一個內置的字符串類型,你應該總是喜歡大多數。

sizeof操作產生的操作,在這種情況下是Ç,其類型爲char*的大小(以字節爲單位) - 它看起來像你實際上在做什麼之後是一個空結尾的字符數組的長度(一個「C」字符串「) - 你已經在使用strlen的,所以我建議你只是想再次使用(以空終止考慮過)

name = resize(name, l, strlen(c) + 1); 

注,您的代碼看起來好像內存泄漏,您正在爲您的名稱分配一個新值變量沒有清理先存在的東西。

if(l < strlen(c)+strlen(name)) 
{ 
    char* my_new_string = resize(name, l, strlen(c)); 
    if(my_new_string != NULL) 
    { 
     delete [] name; 
     name = my_new_string; 
    } 
} 

編輯:正如其他答覆指出,仍有很多毛病可能使用C++的stringvector解決的代碼。

這裏是一個可能的方式,你可以實現add_chars

void MyString::add_chars(char* c) 
{ 
    if(c != NULL && name != NULL) 
    { 
     size_t newlength = strlen(c) + strlen(name) + 1; 
     char* newstring = new char[newlength]; 

     if(newstring != NULL) 
     { 
      size_t namelength = strlen(name); 
      size_t remaining = newlength - namelength; 

      strncpy(newstring, name, newlength); 
      strncpy(&newstring[namelength] , c, remaining); 

      delete [] name; 
      name = newstring; 
     } 
    } 
} 
+0

你得到了Tony錯過的一半,但錯過了他所擁有的部分。 – 2012-04-20 18:32:41

1

此行是錯誤的:

name = resize(name, l, sizeof(c)); 

你不應該採取的sizeof(char*),你的c變量,但你應該做sizeof(char)或只是1.

此外,請確保您的尺寸+1做好零終止char在你的字符串的末尾。

+0

還有其他非常相關的錯誤,'MyString :: resize'改變了一個本地參數,並且從不釋放任何內存。 – 2012-04-20 18:31:37

+0

爲什麼會是sizeof(char)?我添加了多個字符 – varatis 2012-04-20 18:40:22

+0

它實際上應該是'sizeof(n * char)',其中'n'是你添加的字符數量 – 2012-04-20 18:51:12

0

我該如何修復我的代碼?

不要修復它。扔掉它並使用vector<char>或只是string

但我堅持,我該如何修復我的代碼!?

OK,OK,這裏是

  1. ...如何得到一個不錯的調試器,例如this one
  2. 仔細檢查代碼,不斷檢查變量並將它們與您期望的變量進行比較。
  3. 當您撥打電話resize時,請注意sizeof(c)(分配給extra參數resize)。當你意識到這不是你所期望的,問問自己:什麼是目的sizeof,你會明白爲什麼。

順便說一句,你也有內存泄漏和性能很差,因爲所有這些strlen s。

+0

親愛的downvoter,我錯過了一件重要的事情,犯了一個嚴重的錯誤?我不介意被低估,但我想明白爲什麼,所以我可以_learn_。 – 2012-04-20 18:49:29